linux mysql 静态库_Linux静态库与动态库实例详解

Linux静态库与动态库实例详解

1. Linux 下静态链接库编译与使用

首先编写如下代码:

// main.c

#include "test.h"

int main(){

test();

return 0;

}

// test.h

#include

using namespace std;

void test();

// test.c

#include "test.h"

void test(){

cout<< "test!" <

}

然后编译:

1. gcc -c test.c //生成目标文件

2. ar crv libtest.a test.o //生成静态链接库libtest.a

3. g++ -o main main.c -ltest //编译main程序同时链接libtest.a静态库

4. ./main //运行main程序

2. Linux 下动态链接库编译与使用

代码与上述一致。

然后编译:

1. g++ -fPIC -shared -o libtest.so test.c //生成动态链接库libtest.so

2. g++ -o main main.c -ltest //调用动态链接库libtest.so

3. ./main //运行main程序

3. 链接时缺失了相关目标文件(.o)

代码与上述一致。

编译过程如下:

1. gcc -c test.c

2. gcc -c main.c

3. gcc -o main main.o

这时,你会发现,报错了:undefined reference to `test".

这就是最典型的 undefined reference 错误,因为在链接时发现找不到某个函数的实现文件, 本例中test.o文件中包含了test()函数的实现,所以如果按下面这种方式链接就没事了。

1. gcc -o main main.o test.o

【扩展】:其实上面为了让大家更加清楚底层原因,我把编译链接分开了,下面这样编译

也会报undefined reference错,其实底层原因与上面是一样的。

gcc -o main main.c //缺少test()的实现文件

需要改成如下形式才能成功,将test()函数的实现文件一起编译。

gcc -o main main.c test.c //ok,没问题了

4. 链接时缺少相关的库文件(.a/.so)

在此,只举个静态库的例子,假设源码与上述一致。

1. 把test.c编译成静态库:

gcc -c test.c

sr -rc test.a test.o

gcc -c main.c

2. 生成可执行程序:

gcc -o main -main.o

此时同样出现 undefined reference to `test"报错。其根本原因也是找不到test()函数的实现文

件,由于该test()函数的实现在test.a这个静态库中的,故在链接的时候需要在其后加入test.a这个

库,链接命令修改为如下形式即可。

1. gcc -o main main.c ./test.a

5. 多个库文件链接顺序问题

这种问题也非常的隐蔽,不仔细研究你可能会感到非常地莫名其妙。我们依然回到第3小节所讨论

的问题中,在最后,如果我们把链接的库的顺序换一下,看看会发生什么结果?

1. gcc -o main main.o func.a test.a

我们会得到如下的编译错误:

1. test.a(test.o): In function `test":

2. test.c:(.text+0x13): undefined reference to `func"

3. collect2: ld returned 1 exit status

因此,我们需要注意,在链接命令中给出所依赖的库时,需要注意库之间的依赖顺序,依赖其他库

的库一定要放到被依赖库的前面,这样才能真正避免undefined reference的错误,完成编译链接。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值