参考资料:GCC编译C(C++)静态库、动态库
标题 : 工作流程
源文件(*.c/*.cpp) -> 预处理(*.i) -编译(*.S/*.s) -> 汇编(*.o) -> 链接(可执行文件)
预处理:修改*.c/*.cpp,展开预处理指令(#define、#if、#else、#elif、#ifdef、#ifndef、#undef、#endif、#error、#program),生成*.i文件
编译: 将*.i文件编译为*.S/*.s文件,即汇编文件
汇编: 将*.S/*.s汇编文件翻译成机器语言,即*.o文件
链接: 合并文件,生产可执行文件
标题2 : 命令介绍
1. 预处理:gcc -E 源文件(*.c) -o 目标文件(*.i)
2. 编译:gcc -S 源文件(*.i) -o 目标文件(*.s)
3. 汇编: gcc -c 源文件(*.s) -o 目标文件(*.o)
4. 查看gcc版本号: -v
5. 指定静态库/动态库路径: -L 静态库/动态库路径
6. 指定静态库/动态库名称:-l(小写L) 静态库/动态库名称
7. 指定头文件路径:-I(大写i) 头文件路径
8. 添加调试信息(gdb调试用):-g
9. 制作静态库:ar rcs *.a *.o
10. 制作动态库:-shared
11. 优化:-O0/-O1/-O2/-O3
12. 提示更多错误信息: -Wall
标题3 : 单文件/多文件编译
1. 单文件: gcc 源文件.c -o 可执行文件
2. 多文件: gcc 源文件1.c 源文件2.c ... -o 可执行文件
标题4 : 静态库编译及使用
1. 生成静态库
ar rcs 目标文件.a 源文件.o
2. 使用静态库
方法1:gcc 源文件.c -L 静态库路径 -I静态库名称 -I 头文件路径 -o 可执行文件
方法2:gcc 源文件.c 静态库.a -I 头文件路径 -o 可执行文件
标题5 : 动态库编译及使用
1. 生成动态库
gcc -c -fpic 源文件.c -o 目标文件.o
gcc -shared 源文件.o -o 目标文件.so
2. 使用动态库
方法1: gcc 源文件.c -I 头文件路径 动态库.so -o 可执行文件
方法2: gcc 源文件.c -L 动态库路径 -l动态库名称 -I 头文件路径 -o 可执行文件
使用方法2链接生成的可执行文件执行会报找不到动态库的错误,调用 diff + 可执行文件 可以查看依赖项,发现动态库找不到,添加环境变量即可:
export LD_LIBRARY_PATH=动态库路径