gcc 编译

本文详细介绍了GCC编译过程,包括-o选项、头文件路径指定等。接着讨论了静态库和动态库的区别,如静态库的内存消耗和动态库的内存效率。静态库以.lib.a结尾,通过ar命令创建,而动态库以.so结尾,使用gcc -shared创建。动态库的加载依赖LD_LIBRARY_PATH环境变量或配置文件。文章还列举了解决动态库加载错误的四种方法。
摘要由CSDN通过智能技术生成

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 成功!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值