数码控科技猎奇Iphone动漫星座游戏电竞lolcosplay王者荣耀攻略allcnewsBLOGNEWSBLOGASKBLOGBLOGZSK全部技术问答问答技术问答it问答代码软件新闻开发博客电脑/网络手机/数码笔记本电脑互联网操作系统软件硬件编程开发360产品资源分享电脑知识文档中心IT全部全部分类全部分类技术牛文全部分类教程最新网页制作cms教程平面设计媒体动画操作系统网站运营网络安全服务器教程数据库工具网络安全软件教学vbscript正则表达式javascript批处理更多»编程更新教程更新游戏更新allitnewsJava新闻网络医疗信息化安全创业站长电商科技访谈域名会议专栏创业动态融资创投创业学院 / 产品经理创业公司人物访谈营销开发数据库服务器系统虚拟化云计算嵌入式移动开发作业作业1常见软件all电脑网络手机数码生活游戏体育运动明星影音休闲爱好文化艺术社会民生教育科学医疗健康金融管理情感社交地区其他电脑互联网软件硬件编程开发360相关产品手机平板其他电子产品摄影器材360硬件通讯智能设备购物时尚生活常识美容塑身服装服饰出行旅游交通汽车购房置业家居装修美食烹饪单机电脑游戏网页游戏电视游戏桌游棋牌游戏手机游戏小游戏掌机游戏客户端游戏集体游戏其他游戏体育赛事篮球足球其他运动球类运动赛车健身运动运动用品影视娱乐人物音乐动漫摄影摄像收藏宠物幽默搞笑起名花鸟鱼虫茶艺彩票星座占卜书画美术舞蹈小说图书器乐声乐小品相声戏剧戏曲手工艺品历史话题时事政治就业职场军事国防节日风俗法律法规宗教礼仪礼节自然灾害360维权社会人物升学入学人文社科外语资格考试公务员留学出国家庭教育学习方法语文物理生物工程学农业数学化学健康知识心理健康孕育早教内科外科妇产科儿科皮肤科五官科男科整形中医药品传染科其他疾病医院两性肿瘤科创业投资企业管理财务税务银行股票金融理财基金债券保险贸易商务文书国民经济爱情婚姻家庭烦恼北京上海重庆天津黑龙江吉林辽宁河北内蒙古山西陕西宁夏甘肃青海新疆西藏四川贵州云南河南湖北湖南山东江苏浙江安徽江西福建广东广西海南香港澳门台湾海外地区

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

来源:脚本之家  责任编辑:小易  

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

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

您可能感兴趣的文章:


  • 本文相关:
  • linux动态库函数的详解
  • 详解dll动态库的开发与调用及文件的读写小程序
  • android studio2.3如何编译动态库的过程详解
  • linux下g++编译与使用静态库和动态库的方法
  • linux环境g++编译gdal动态库操作方法
  • 解决linux程序编译链接动态库版本的相关问题
  • xcode 详解创建静态库和动态库的方法
  • 浅谈linux c语言动态库及静态库
  • c++实现加载so动态库中的资源
  • linux 程序、动态库、静态库内部添加版本号和编译时间详解
  • 从源码编译android系统的java类库和jni动态库的方法
  • c#调用非托管动态库中的函数方法
  • visual studio中根据系统区分引用64位、32位dll动态库文件的配置方法
  • 动态库调用静态库示例讲解
  • linux生成(加载)动态库静态库和加载示例方法
  • 深入探讨linux静态库与动态库的详解(一看就懂)
  • 分析windows和linux动态库
  • 在动态库和静态库中使用模板(dynamic libraries ,static libraries)
  • 一步步教你如何开启、关闭ubuntu防火墙
  • c语言中 malloc,calloc,realloc的区别
  • apache 解决80端口占用问题
  • linux系统中rsync+inotify实现服务器之间文件实时同步
  • 关于opensips用户认证配置文件 opensips.cfg 使用介绍
  • windows下安装pear php5.3.1下解决出错的方法
  • linux系统扩容根目录磁盘空间的操作方法
  • 浅谈linux下的串口通讯开发
  • linux url的301重定向代码分析
  • 科普solaris系统安全常用命令小结
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved