作者:朱金灿

来源:http://blog.csdn.net/clever101

使用CodeBlocks10.05编一个小程序用到了png库和zlib库。我发现编译png静态库时,只需要指定zlib库的头文件路径,但并不需要链接到zlib库(这个我感觉有点奇怪)。 然后编译自己写的程序时出现一个错误:

undefined reference to `inflateInit_'|

inflateInit是zlib库的一个函数,这里编译错误显示为inflateInit_(我估计是gcc给函数添加了修饰符的缘故)。我检查了我的包含头文件路径和lib文件,都设置好了,为何会出现这个错误呢?后来很偶然的想到是不是链接库的顺序问题,就改了下顺序,将下图的:

修改为下图:

即把png库提到zlib库的前面然后重新编译这个编译错误就消失了。这是为什么呢?

上论坛求教,mLee79大侠告诉我:gcc 从前到后在各个符号,找不到就报错, 又不会往前面去找。如果不想安排链接顺序,就在编译选项添加 -Xlinker "-("$(LIBS) -Xlinker "-)"。一个简单的例子是:

$ for file in app.c f1.c f2.c f3.c ; do echo ---- $file ; cat $file ; done ;  gcc -c f1.c f2.c f3.c ; \ar crf lib1.a f1.o f3.o ; ar crf lib2.a f2.o ;  gcc app.c lib1.a lib2.a ; \gcc app.c -Xlinker "-(" lib1.a lib2.a -Xlinker "-)"
---- app.c
int main()
{extern int f1( int , int );extern int f2( int , int );return f1( 1 , 2 ) + f2( 3, 4 );
}
---- f1.c
int f1( int a , int b ) { return a + b; }
---- f2.c
extern int f3( int , int );
int f2( int a , int b ) { return a * b - f3( a , b ); }
---- f3.c
int f3( int a , int b ) { return a - b; }lib2.a(f2.o):f2.c:(.text+0x1e): undefined reference to `_f3'
collect2: ld returned 1 exit status

这里简单说明下这个例子:程序首先链接的lib1(f3符号在lib1),当程序链接到lib2时,很自然就找不到f3(因为lib1在lib2的前面),

不过可以想象加 -Xlinker肯定很慢,因为每个符号都要查找所有的库。因此要解决此类链接错误还是得安排链接库的顺序,遵循的原则是上层调用库放在底层被调用库的前面。在此非常感谢mLee79大侠!

作者:clever101 发表于2012-2-27 20:50:45 原文链接
阅读:767 评论:2 查看评论

转载于:https://www.cnblogs.com/wdpp/archive/2012/02/27/2387069.html

[原]从一个链接错误探究GCC的链接库顺序相关推荐

  1. linux 静态编译 glibc,GCC静态链接glibc库

    如果你的编译环境是高版本的glibc库,而运行程序的环境(机器)安装的glibc是低版本的话,在运行程序的时候,就会告诉你 cannot find GLIBC_2.14 类似这样的错误,上面的2.14 ...

  2. Gcc编译链接及常用选项总结

    转载文章:http://www.franktly.com 前言 GNU CC(简称Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object- C等语言编写的程序.Gcc ...

  3. Linux gcc/g++链接编译顺序详解

    gcc/g++链接时对库的顺序要求 -LdirAdd directory dir to the list of directories to be searched for -l. -llibrary ...

  4. Memcheck:一个内存错误检测器

    目录 4.1.概观4.2.来自Memcheck的错误消息说明 4.2.1.非法读取/非法写入错误4.2.2.使用未初始化的值4.2.3.在系统调用中使用未初始化或不可寻址的值4.2.4.非法释放4.2 ...

  5. GCC同时使用静态库和动态库链接

    转自:https://www.cnblogs.com/lidabo/p/6206504.html chapter1 在应用程序需要连接外部库的情况下,linux默认对库的连接是使用动态库,在找不到动态 ...

  6. MS VC6 链接错误处理

    目录(?)[+] 原帖地址:http://king-dxs.spaces.live.com/blog/cns!827cef33a5708083!178.entry 在Windows XP下编译的软件, ...

  7. GCC 编译链接命令用法

    Contents 一.简介... 2 二.简单编译... 2 2.1预处理... 2 2.2编译为汇编代码(Compilation). 3 2.3汇编(Assembly). 3 2.4连接(Linki ...

  8. 使用gcc编译和链接C语言程序,用GCC编译链接程序--编译链接器GCC常用功能(菜鸟级)...

    转载自:http://daimajishu.iteye.com/blog/1089740 对gcc认识的一篇文章,就转载了,截取了自己感兴趣部分. 一,GCC编译器简介 虽然我们称Gcc是C语言的编译 ...

  9. 小猫爪:嵌入式小知识07-MCUXpresso GCC ld链接文件解析-链接代码至RAM

    小猫爪:嵌入式小知识07-MCUXpresso GCC ld链接文件解析-链接代码至RAM 1 前言 2 基本语法 3 实例解析 4 链接代码至RAM 4.1 链接自定义section至RAM 4.2 ...

最新文章

  1. php进攻教程,如何对PHP程序中的常见漏洞进行攻击(下)_php基
  2. 数据中台实战(八):如何打造可以支撑N条产品线的标签平台
  3. FTP安装及用户及权限配置
  4. (转)关于做android+J2ee系统集成开发的一点心得
  5. Windows Presentation Foundation 开始介绍
  6. 验证码图片 java_验证码图片
  7. ZK 数据传输三:在页面使用SpringUtil获取spring层类再获取数据(jsp页面或zul页面)...
  8. 看不懂英文文档,是我们英语太差吗?
  9. 精简版Android ProtoBuf入门
  10. python_计算股票指标
  11. 人脸活体检测:活体检测数据集
  12. Redis(八) - Redis企业实战之优惠券秒杀
  13. 【JZOJ 5426】【NOIP2017提高A组集训10.25】摘Galo
  14. 腾讯云-即时通信 IM uni-app 和 java 整合过程
  15. 女人也真不容易(续)——37度男人
  16. 【纯音的世界】系列---【静音吧】爱.请给我时间.
  17. 2018千峰PHP教程完整版
  18. (转)DNS Proxy配置
  19. idm下载器2024官方最新中文版免费下载
  20. 巴菲特致股东的一封信:1983年

热门文章

  1. MyBatis快速将MySQL转换成Oracle语句
  2. 案例篇-HBase 实战之 MOB 使用指南
  3. 【OCR技术系列之五】自然场景文本检测技术综述(CTPN, SegLink, EAST)
  4. 帮助 Medium 阅读时间达到 2600 年的技术栈
  5. react-redux学习笔记
  6. SpringAop通知
  7. centOS6.4下Percona-XtraBackup的安装
  8. Asp.net基础概念之 委托
  9. exchange2003的简单安装方法
  10. C++之文件IO操作流