I/O笔记
1. 条件编译
#ifdef 宏名
代码段
#endif
编译时,使用命令gcc xxx.c -D 宏名可以执行该段代码
2. 屏蔽代码
#if 0
想要屏蔽的代码
#endif
当想要屏蔽某段代码时,使用上述方法屏蔽代码
3. 库
3.1 库的命名规范
- 静态库:lib[库名].a
- 动态库:lib[库名].so
3.2 静态库
3.2.1 静态库的介绍
- 静态库:静态库是编译时链接的库,一般在Linux下,以".a"为文件后缀,在Windows下,静态库以".lib"为后缀
3.2.2 静态库的制作与链接
-
制作
-
编写代码
-
将源文件(.c文件)编译成目标文件(.o文件)
gcc -c mysort.c MYSORT.o
-
使用ar工具将目标文件(.o文件)打包成静态库文件(.a文件)
ar -crv libmysort.a MYSORT.o
生成静态库文件libmysort.a
-
-
链接
gcc xxx.c -L+库所在路径 -l库名
例如 gcc 1.c -L…/ -l2:将1.c与在上级目录的库2链接
3.3 动态库
3.3.1 动态库的介绍
- 动态库:动态库也叫共享库,是运行时链接的库,一般在Linux下,以".so"为文件后缀,在Windows下,动态库以".dll"为后缀
3.3.2 动态库的制作与链接
-
制作
-
编写代码
-
将源文件(.c文件)编译成目标文件(.o文件),此时要加上编译器选项-fPIC(该选项的作用是创建与地址无关的编译程序)
gcc -fPIC -c mysort.c
-
生成动态库文件(.so),此时要加上链接器选项-shared(该选项的作用是生成动态链接库)
gcc -shared -o libmysort.so mysort.o
上述两部命令可以合为一个
gcc -shared -fPIC -c mysort.c -o libmysort.so
-
-
链接
gcc xxx.c -L+库所在路径 -l库名
例如 gcc 1.c -L…/ -l2:将1.c与在上级目录的库2链接
动态库文件默认与环境变量中的文件链接,所以需将当前路径写入环境变量,也可将动态库放在/usr/lib目录之下
3.4 静态库与动态库的区别
区别点 | 静态库 | 动态库 |
---|---|---|
链接阶段 | 编译时链接 | 运行时链接 |
文件后缀 | .a/.lib | .so/.dll |
共享性 | 无 | 有 |
可移植性 | 需要静态编译,操作方便 | 需要反复交叉编译。配置路径,操作麻烦 |
可执行文件大小 | 生成的可执行文件较大 | 并没有直接编译到可执行文件。所以生成的可执行文件较小 |
制作过程不同 | ar -crv libxxx.a xxx.o | gcc -shared -fPIC -c xxx.c -o libxxx.so |
使用场景 | 不要求共享,排除环境变量的干扰,可执行文件不大,软件版本相对稳定,很少升级 | 有共享性要求,软件版本升级频繁,有远程部署和升级需求 |