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

吾爱主题 阅读:141 2024-04-05 13:51:54 评论:0

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

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

首先编写如下代码:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 // main.c #include "test.h" int main(){    test ();    return 0;  }   // test .h #include<iostream> using namespace std; void test ();   // test .c #include "test.h" void test (){   cout<< "test!" <<endl; }

然后编译:

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 1. gcc -o main main.o test .o
?
1 2 3 4 5 6 7 8 【扩展】:其实上面为了让大家更加清楚底层原因,我把编译链接分开了,下面这样编译 也会报undefined reference错,其实底层原因与上面是一样的。   gcc -o main main.c // 缺少 test ()的实现文件   需要改成如下形式才能成功,将 test ()函数的实现文件一起编译。   gcc -o main main.c test .c //ok ,没问题了

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

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 在此,只举个静态库的例子,假设源码与上述一致。   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. 多个库文件链接顺序问题

?
1 2 3 4 5 6 7 8 9 10 11 12 这种问题也非常的隐蔽,不仔细研究你可能会感到非常地莫名其妙。我们依然回到第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的错误,完成编译链接。

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

原文链接:http://blog.csdn.net/u013709270/article/details/53264141

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容