如何将静态库.a和目标文件.o连接成一个目标文件

本文详细介绍了如何使用ld命令将静态库作为目标文件进行连接,包括命令参数ld--r*.a*.o-oa.out的含义及应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当用连接器连接静态库时可以把静态库当做目标文件来处理。

ld --r *.a *.o -o a.out

1)首先进入第二个实验目录second,然后创建4个文件add.c, sub.c,div.c,test.h /*****add.c*****/ #include "test.h" int add(int a,int b) { return a + b; } /*****sub.c*****/ #include "test.h" int sub(int a,int b) { return a - b; } /*****div.c*****/ #include "test.h" int div(int a,int b) { return a / b; } /*****test.h*****/ #ifndef __TEST_H_ #define __TEST_H_ int add(int a,int b); int sub(int a,int b); int div(int a,int b); #endif 2) 编译生成目标文件gcc -c *.c *.c表示所有以.c结尾的文件,也即所有的源文件。执行完该命令,会发现 second 目录中多了三个目标文件,分别是 add.o、sub.o div.o。 3)把所有目标文件打包成静态库文件: ar rcs libtest.a *.o *.o表示所有以.o结尾的文件,也即所有的目标文件。执行完该命令,发现 test 目录中多了一个静态库文件 libtest.a。 4)创建新的目录结构:在second目录下创建math目录,在math下创建include, lib, src三个目录,并将test.h移动到include下: 在src目录下创建一个新的测试文件main.c,在 main.c 中,可以像下面这样使用 libtest.a 中的函数:: /*****main.c*****/ #include <stdio.h> #include "test.h" //必须引入头文件 int main(void) { int m, n; printf("Input two numbers: "); scanf("%d %d", &m, &n); printf("%d+%d=%d\n", m, n, add(m, n)); printf("%d-%d=%d\n", m, n, sub(m, n)); printf("%d÷%d=%d\n", m, n, div(m, n)); return 0; } 在编译 main.c 的时候,我们需要使用-I(大写的字母i)选项指明头文件的包含路径,使用-L选项指明静态库的包含路径,使用-l(小写字母L)选项指明静态库的名字。所以,main.c 的完整编译命令为: gcc src/main.c -I include/ -L lib/ -l test -o math.outcd 注意,使用-l选项指明静态库的名字时,既不需要lib前缀,也不需要.a后缀,只能写 test,GCC 会自动加上前缀后缀。 打开 math 目录,发现多了一个 math.out 可执行文件,使用./math.out命令就可以运行 math.out 进行数学计算。3. GCC 生成使用动态链接库 1)从文件中生成动态库 从单个源文件生成动态链接库: $ gcc -fPIC -shared xxx.c -o libxxx.so 从目标文件生成动态链接库: $ gcc -fPIC -c xxx.c -o xxx.o $ gcc -shared xxx.c -o libxxx.so 从多个文件生成动态库: gcc -fPIC -shared xxx1.c xxx2.c xxx3.c -o libxxx.so 或:gcc -fPIC -shared xxx1.o xxx2.o xxx3.o -o libxxx.so 2)接上面第2个实例,首先已经编译生成的目标文件不能再用,因为不是按照动态链接方式生成的,如果需要就还需要再次重新编译目标文件: gcc -fPIC -c add.c -o add.o 3)在此我们直接用源文件来重新编译直接生成动态链接库文件: gcc -fPIC -shared add.c sub.c div.c -o libtest.so 4)使用动态链接库: 重新对测试程序main.c编译,这次采用动态链接库: gcc src/main.c lib/libtest.so -o math2 生成后执行math2: 根据给的资料帮我给出执行代码
最新发布
03-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值