IO——目录&库

目录

围绕目录流进行操作:DIR*
opendir
closedir
readdir
chdir

操作:

DIR *opendir(const char *name);
功能:获得目录流
参数:要打开的目录
返回值:成功:目录流
       失败:NULL
       
struct dirent *readdir(DIR *dirp);
功能:读目录
参数:要读的目录流
返回值:成功:读到的信息    
       失败:NULL
返回值为结构体,该结构体成员为描述该目录下的文件信息

struct dirent {
    ino_t   d_ino;               /* 索引节点号*/
    off_t   d_off;               /*在目录文件中的偏移*/
    unsigned short d_reclen;     /* 文件名长度*/
    unsigned char  d_type;       /* 文件类型 */
    char    d_name[256];         /* 文件名 */
};

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

头文件:#include<stdio.h>
<>代表去系统路径下查找头文件/usr/include
#include"head.h"
""代表先去当前路径下查找,找不到再去系统路径下查找
头文件也就是.h结尾的文件,其中包含:宏定义、结构体、联合体、枚举的定义、函数声明、重命名、其他头文件、条件编译、外部引用
源文件:包含main函数的xx.c
包含子函数的xx.c,封装的函数需要在头文件中声明
库文件(不能包含main函数)

库的定义

当使用别人的函数时除了包含头文件以外还需要有库
头文件也就是.h结尾的文件,其中包含:宏定义、结构体、联合体、枚举的定义、函数声明、重命名、其他头文件、条件编译、外部引用
库:把一些常用的函数的目标文件打包在一起,提供相应的函数接口,便于程序员使用。本质上来说库是一种可执行代码的二进制形式文件。

库的分类

静态库和动态库,本质区别时代码载入的时刻不同

静态库

静态库在程序编译时会被复制到目标代码中, 以.a结尾。

动态库

动态库是在程序运行时才被载入代码中。也叫共享库,以.so结尾。
静态库和动态库的总结
静态库:编译阶段,体积大,移植性好,升级麻烦
动态库:运行阶段,体积小,移植性弱,升级简单

库的制作

静态库

(1) 将源文件编译生成目标文件xx.o
gcc -c fun.c -o fun.o
(2) 创建静态库用ar命令,将很多.o文件转换成一个.a文件
ar crs libmyfun.a fun.o
静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a
(3) 测试使用静态库:
gcc main.c -L. -lmyfun //-L指定库的路径 -l指定库名
执行:./a.out

动态库

(1) 用gcc创建共享库
gcc -fPIC -c fun.c -o fun.o //-fPIC创建与地址无关的编译程序
gcc -shared -o libfun.so fun.o
(2) 测试使用动态库
gcc main.c -lfun
执行:./a.out

可以正常编译通过,但是运行时报错error while loading shared libraries: libmyadd.so: cannot open shared object file: No such file or directory
原因:当加载动态库时,系统会默认从/lib或/usr/lib路径下查找库文件,所以需要把库拷贝到/usr/lib或者lib目录下,编译时不用-L加路径了,直接gcc main.c -lfun就可以了

解决方法(有三种):

  1. 把库拷贝到/usr/lib和/lib目录下。(此方法编译时不需要指定库的路径)
  2. 在LD_LIBRARY_PATH环境变量中加上库所在路径。
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
    (终端关闭,环境变量就没在了)
  3. 添加/etc/ld.so.conf.d/*.conf文件。把库所在的路径加到文件末尾,并执行ldconfig刷新
    sudo vi xx.conf
    添加动态库存在的路径,如:
    /home/hq/work/lib

一些编译指令
-L路径:指定库的路径
-l库名:指定库名
-I(大写i):指定头文件路径,默认查找路径/usr/include
#include <stdio.h> //从系统路径下查找头文件
#include “head.h” //从当前路径下查找此头文件
ldd可执行文件名:查看链接的动态库
注意:
同名的静态库和动态库:默认优先使用动态库,如果想使用静态库 需要在后面加 -static,这是内核规定的。

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值