从一个链接错误探究GCC的链接库顺序
来源:互联网 发布:python read 长度 编辑:程序博客网 时间:2024/06/04 19:08
作者:朱金灿
来源: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.cint main(){ extern int f1( int , int ); extern int f2( int , int ); return f1( 1 , 2 ) + f2( 3, 4 );}---- f1.cint f1( int a , int b ) { return a + b; }---- f2.cextern int f3( int , int );int f2( int a , int b ) { return a * b - f3( a , b ); }---- f3.cint 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大侠!
- 从一个链接错误探究GCC的链接库顺序
- GCC 库链接顺序
- gcc 链接库的顺序问题
- gcc 链接库的顺序问题
- VC缺省链接库的顺序不对导致链接错误
- gcc 链接顺序
- gcc链接顺序
- gcc库的链接顺序导致编译出错的问题
- gcc中动态库和静态库的链接顺序
- gcc中动态库和静态库的链接顺序
- gcc中动态库和静态库的链接顺序
- 由于gcc静态链接库顺序引起的问题
- GCC 链接顺序导致使用MongoDB的应用链接失败
- GCC链接中的库依赖,调整链接时库文件的顺序
- GCC链接中的库依赖,调整链接时库文件的顺序
- 小记:注意GCC链接中的库依赖,调整链接时库文件的顺序
- gcc/g++动态链接库和静态库的链接顺序
- 静态链接时链接库的顺序
- 子集树变式问题
- 浅谈设计模式——抽象工厂模式
- 双击dataGridView1中任意的单元格触发
- PostgreSQL启动过程中的那些事七:初始化共享内存和信号八:shmem中初始化常规锁管理器
- 2011年 c++程序设计
- 从一个链接错误探究GCC的链接库顺序
- 你必须知道的【闭包】陷阱和案例
- TCP与UDP的区别(转载)
- JS正则表达式
- 常用js验证
- Oracle经验集锦
- 打开,关闭窗口代码
- 2011年 C++程序设计
- 怎样提高软件技术:从新手到入门的一些思考