目录操作、库

目录操作

围绕 目录流 进行操作,目录流用 DIR * 表示。

opendir

DIR *opendir(const char *name);
功能:获得目录流
参数:要打开的目录
返回值:成功:目录流
       失败:NULL

在这里插入图片描述

closedir 
int closedir(DIR *dirp);
功能:关闭目录
参数:dirp:目录流

在这里插入图片描述

readdir
struct dirent *readdir(DIR *dirp);
功能:读目录
参数:要读的目录流
返回值:成功:读到的信息    
              失败:NULL,设置errno号
返回值为结构体,该结构体成员为描述该目录下的文件信息
struct dirent {
        ino_t   d_ino;                  /* 索引节点号*/
        off_t   d_off;               	/*在目录文件中的偏移*/
        unsigned short d_reclen;    	/* 文件名长度*/
        unsigned char  d_type;      	/* 文件类型 */
        char    d_name[256];      		/* 文件名 */
};

在这里插入图片描述

实现 ls 功能

// 实现 ls 功能(不包含隐藏文件)
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>

int main(int argc, char const *argv[])
{
    DIR *dr = opendir(".");
    if (dr == NULL){
        perror("Failed: ");
        return -1;
    }

    struct dirent *reader;
    while (reader = readdir(dr)){
        if (reader->d_name[0] == '.')
            continue;
        printf("%s\t", reader->d_name);
    }
    putchar(10);
    
    closedir(dr);
    return 0;
}

头文件:#include <xxx.h>
#include “xxxx.h”
通常包含 函数声明、结构体、宏定义、共用体、枚举、其他头文件、重定义、条件编译……
源文件:xxxxx.c

概念

把一些常用函数的目标文件打包在一起,提供相应函数的接口,便于程序员使用;
本质上来说库是一种可执行代码的二进制形式(Linux 与 Windows 不兼容)。

分类、区别

根据本质区别(代码被载入时刻不同),分为 静态库和动态库。

静态库

静态库 在程序编译时 会被连接到目标代码中。
优点:程序运行时将不再需要该静态库;运行时无需加载库,运行速度更快。
缺点:静态库中的代码复制到了程序中,因此体积较大;
静态库升级后,程序需要重新编译链接

动态库

动态库 在程序运行时 才被载入代码中。
优点:程序在执行时加载动态库,代码体积小;程序升级更简单,不需要重新编译链接。
不同应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。
缺点:运行时还需要动态库的存在,移植性较差。

静态库的制作

1)将源文件编译生成目标文件

gcc -c xxx.c -o xxx.o

2)创建静态库,使用 ar命令,将许多.o文件转换成.a文件

ar crs libxxx.a xxx.o…
静态库文件名的命名规范:以 lib为前缀,紧接着跟静态库名,扩展名为 .a

3)测试静态库的使用

编译:gcc main.c -L指定库的路径名 -l指定库名
执行:./a.out

在这里插入图片描述

动态库的制作

1)创建共享库

gcc -fPIC -c xxx.c -o xxx.o

gcc -shared -o libxxx.so xxx.o…
动态库文件名的命名规范:以 lib为前缀,紧接着跟动态库名,扩展名为 .so

2)测试动态库的使用

编译:gcc xxx.c -L路径 -l库名
执行:./a.out

注意:可以正常编译通过,但是运行时报错。
在这里插入图片描述

报错原因:当加载动态库时,系统会默认从 /usr/lib 或 /lib 路径下查找库文件。
解决方法(三种):
① 把库拷贝到 /usr/lib 和 /lib目录下。(此方法编译时不需要指定库的路径)
② 在LD_LIBRARY_PATH 环境变量中加上库所在路径。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

(当终端关闭,环境变量就不在了;或打开其他终端执行 ./a.out 无效)

③ 添加 /etc/ld.so.conf.d/*.conf 文件。把库所在的路径加到文件末尾,并执行 ldconfig 刷新。

sudo vi /etc/ld.so.conf.d/*.conf
在这里插入图片描述

添加动态库存在的路径,如:
在这里插入图片描述

刷新:sudo ldconfig
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值