2.gcc 编译流程-C语言
- gcc -E hello.c > hello.i
- 预处理,头文件展开,宏替换
- gcc -E 默认输出在屏幕上,
- 使用重定向
>
清空文件内容写入 >>
在文件啊后继续添加
- gcc -S hello.i
- 生成汇编语言
- 生成hello.s文件
- gcc -c
- 将汇编翻译成二进制文件
- 生成hello.o文件
- ld 链接
- 得到a,out
- -I ./include 指定头文件路径
- -o 指定输出文件
- -o hello.out
- -D DEBUG 指定宏编译,可以用于Debug
- -L 指定库路径
- -g 用于gdb调试,不加此选项不能进行gdb调试
- -Wall 显示更多得警告
- gcc hello.cpp -lstdc++ 用gcc编译c++文件
3.制作库
- 静态库
- 文件命名:libxxx.a 对应windows的lib文件
gcc -c
生成.o文件ar rcs libCalc.a *.o
生成.a
文件- 可以用
nm filename
查看文件内容 - 发布,与头文件
.h
一起发布 - 使用:
gcc main.c -o main.out -I include/ -L lib/ -lCalc
- -I 头文件目录
- -L 库文件目录
- -l+库名(libCalc.a 取Calc )
- 动态库
- 编译与位置无关的文件 生成
.o
文件 ,关键参数-fPIC
gcc -fPIC -c *.c -I ../include/
- 将
.o
文件打包成.so
文件,关键参数-shared
gcc -shared -o libCalc.so *.o
- 将库与头文件一起发布
- 使用:
- 拷贝到
/lib
目录下,不允许ln -s srcpath /lib/libCalc.so
软连接ldd filename
是:list dynamic dependencies 列出动态库依赖关系
- 将库路径添加到环境变量
LD_LIBRARY_PATH
,一般推荐echo $LD_LIBRARY_PATH
查看环境变量export LD_LIBRARY_PATH=/home/lcl/cmd/Calc/lib/: $LD_LIBRARY_PATH
,:
分割不会影响之前的环境变量
- 配置
/etc/ld.so.conf
文件,增加/home/-----
,再执行sudo ldconfig -v
,-v
是显示运行,非常常用sudo vi /etc/ld.so.conf
- 添加路径
sudo ldconfig -v
- 拷贝到
- 编译与位置无关的文件 生成
- 优缺点:
静态库 | 动态库 | |
---|---|---|
优点 | 1. 执行快 2.发布应用时不需要发布库 | 1.执行体积小 2.库变更时一般不需要重新编译应用 |
缺点 | 1.执行程序体积比较大 2.库变更时需要重新编译应用 | 1.执行时需要加载动态库,相对慢 2.发布应用时需要同时发布动态库 |