-
gcc编译流程
- 预处理
gcc -E main.c -o main.i
预处理主要进行头文件展开,宏替换,去注释
- 编译
gcc -S main.i -o main.s
将预处理得到的源代码文件进行“翻译转换”得到汇编文件
- 汇编
gcc -c main.s -o main.o
汇编器将汇编文件翻译为二进制文件
- 链接
gcc main.o -o main
链接器将函数库中相应的代码各种符号引用符号链接组合到目标文件中
- 预处理
-
gcc使用与常用参数说明
- -o
/* -o 对输出文件的文件名进行指定 */ gcc main.c -o main.out
- -I
/* -I 指定头文件目录,老版本-I与路径之间是不可以有空格的 */ gcc -I /home/lib main.c -o main.out
- -D
/* -D 在编译阶段指定一个全局宏 */ gcc main.c -D APPDEBUG
- -O
/* -O 做代码优化, 最高等级3, 减少代码冗余 */ gcc main.c -O3
- -Wall
/* -Wall输出警告信息 */ gcc main.c -Wall
- -g
/* -g 添加调试信息 */ gcc main.c -g
- -c
/* -c 只生成子程序 */ gcc main.c -c
- -E
/* -E 生成预处理文件 */ gcc main.c -E
- -L -l
/* -L指定静态库目录 -l静态库名(去掉首尾lib与后缀) */ gcc main.c -L /usr/lib -laaa
-
静态库的制作与使用
- 命名规则
lib + library_name + .a
libmylibrary.a - 制作步骤
a. -c 生成与位置有关的.o
静态库会打包到可执行文件,位于程序虚拟地址空间中固定的代码段
b. 将生成的.o文件打包(ar rcs library_name(静态库名) *.o)
/* 生成.o文件 */ gcc -c main.cpp -o test.o /* 打包静态库文件 */ ar rcs libmylib.a *.o
- 命名规则
-
静态库的优缺点
优点: 1.发布程序时,已经将静态库中被使用的部分打包到了可执行文件中,不需要提供对应的库。 2.库的加载速度快
缺点: 1.库打包到可执行文件中,导致程序的体积过大 2.库发生改变,需要重新编译程序
-
动态库(共享库)的制作与使用
- 命名规则
lib + library_name + .so
libmylibrary.so - 制作步骤
a. -fPIC -c 生成与位置无关的.o
b. 打包.so (gcc -shared)
/* 生成与位置有关的.o */ gcc -fPIC -c *.c /* gcc -shared 打包共享库 */ gcc -shared libmyshared.so *.o /* 动态库使用 2. */ gcc main.c libmyshared.so -o app -Iinclude_dir
- 解决动态库链接失败
1. 将动态库放入系统动态库目录 (不推荐)
2. LD_LIBRARY_PATH 环境变量会优先查找该变量指定的目录,再搜索默认的环境变量动态库路径(蠢了点)
3. 修改ld.so.conf(动态链接库配置文件),将动态库所在目录路径添加到ld.so.conf中, ldconfig更新配置文件
- 命名规则
-
动态库优缺点
优点: 1.程序体积小 2.动态库更新不需要重新编译程序
缺点: 1.需要发布动态库给用户 2.动态库加载速度相较静态库慢