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

作者:JeemyJohn 时间:2023-08-19 22:30:20 

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

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

首先编写如下代码:


// 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. 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的错误,完成编译链接。

来源:http://blog.csdn.net/u013709270/article/details/53264141

标签:Linux,静态库,动态库
0
投稿

猜你喜欢

  • 固若金汤 网站后台不容忽视的几个安全问题

    2009-01-30 02:25:00
  • 聚有客之路(二)对Google AdSense的期待

    2009-01-05 14:13:00
  • SpringBoot整合Activiti7的实现代码

    2023-11-03 20:58:29
  • virtualbox 中的linux 共享文件的方法

    2023-06-10 10:57:22
  • 建立Web应用的一个新途径

    2007-03-28 15:44:00
  • ASP漏洞全接触-SQL注入入门篇

    2007-10-31 20:17:00
  • 服务器CPU监控小工具下载

    2010-04-06 19:19:00
  • 对于IT类个人博客推广的八条建议

    2008-06-01 15:59:00
  • 为什么是注册用户

    2007-08-23 08:05:00
  • 竞合将是未来视频行业的主旋律

    2009-10-16 09:34:00
  • 三大搜索引擎对英文站收录的策略

    2007-11-10 18:11:00
  • 关于Prower V2主题使用中出现的问题集锦

    2009-05-20 11:21:00
  • Win 2000的超酷技巧

    2007-08-23 14:14:00
  • SEO 观察篇

    2007-08-05 18:09:00
  • Ubuntu下开启Apache对.htaccess 的支持

    2023-07-28 08:16:49
  • Linux配置SSH和Xshell连接服务器的教程(图解)

    2021-01-17 20:26:59
  • 情人节到喽!Silverlight情人节贺卡

    2008-02-14 17:28:00
  • 搜索引擎优化的中英文区别

    2008-12-31 12:58:00
  • 增加外链和反向链接质量 途径及注意事项

    2008-12-25 11:16:00
  • GoDaddy:如何使用File Manager上传文件

    2010-05-01 12:53:00
  • asp之家 网站运营 m.aspxhome.com