gcc编译流程
逐步完成
※ -o 表示输出
gcc -E hello.c -o hello.i
gcc -S hello.i -o hello.s
gcc -c hello.s -o hello.o
gcc hello.o -o hello
一次完成
gcc hello.c -o hello
若头文件与源码不在同一目录,则需要用 [-I] 指定头文件所在位置。
gcc -I ./dir hello.c -o hello
其他参数:
-g 编译时添加调试文件,用于gdb调试
-Wall 显示所有警告信息
-D 向程序中“动态”注册宏定义
-l 指定动态库库名
-L 指定动态库路径
静态库
静态库在文件中静态展开,所以有多少文件就展开多少次,非常吃内存,100M 展开 100 次,就是 1G。优点是加载速度块。
静态库名字以lib开头,以.a结尾。生成指令:ar rcs libmylib.a file1.o file2.o ...
静态库使用:gcc test.c libmylib.a -o test
假如test.c 大小有128,test大小有2048,这表明静态库直接编译到了文件中。
为了防止重复展开静态库,可以运用头文件的方式展开静态库。
动态库
使用动态库会将动态库加载到内存,10 个文件也只需要加载一次,然后这些文件用到库的时候临时
去加载,速度慢一些,优点是省内存。
制作动态库的步骤
1. 生成位置无关的.o 文件
gcc -c add.c -o add.o -fPIC
使用这个参数过后,生成的函数就和位置无关,挂上@plt 标识,等待动态绑定
2.使用 gcc -shared 制作动态库
gcc -shared -o lib库名.so add.o sub.o div.o
3.编译可执行程序时指定所使用的动态库。-l:指定库名 -L:指定库路径
gcc test.c -o a.out -l 库名 -L ./lib
4. 运行可执行程序:./a.out
动态库加载错误原因及解决方式
两个原因:工作于链接阶段,工作时需要 -l 和 -L;工作于程序运行阶段,工作时需要提供动态库所在目录位置。
工作运行时,需要配置环境变量指定动态库路径并使其生效,再执行文件,解决方式有四种:
1、临时设置环境变量:export LD_LIBRARY_PATH=动态库路径
2、永久配置环境变量,将路径写入终端配置文件:
1) vi ~/.bashrc
2) 写入 export LD_LIBRARY_PATH=动态库路径 保存
3). .bashrc/ source .bashrc / 重启 终端 ---> 让修改后的.bashrc 生效
4)./a.out 成功!!!
3、拷贝自定义动态库 到 /lib (标准 C 库所在目录位置)
4、配置文件法:
1)sudo vi /etc/ld.so.conf
2) 写入 动态库绝对路径 保存
3) sudo ldconfig -v 使配置文件生效。
4)./a.out 成功!!!
本文详细介绍了GCC编译过程,包括-o选项、头文件路径指定等。接着讨论了静态库和动态库的区别,如静态库的内存消耗和动态库的内存效率。静态库以.lib.a结尾,通过ar命令创建,而动态库以.so结尾,使用gcc -shared创建。动态库的加载依赖LD_LIBRARY_PATH环境变量或配置文件。文章还列举了解决动态库加载错误的四种方法。
719

被折叠的 条评论
为什么被折叠?



