linux链接器:' - lpng'禁止'-lz'?

时间:2013-10-06 17:15:52

标签: linux gcc linker

在ubuntu-13.04上,使用Linux发行版提供的GCC-4.7.3从共享库构建可执行文件时出错。

我猜问题是在libpng和zlib之间(前者使用后者),但我不知道为什么。

首先,我的命令是:

$ gfortran -o test_muesli_config_fml test_muesli_config_fml.o -fopenmp 
-Wl,--rpath,/usr/local/lib/muesli /usr/local/lib/muesli/libfml.so -lstdc++
-Wl,--rpath,/usr/lib /usr/lib/liblapack.so -Wl,--rpath,/usr/lib /usr/lib/libblas.so
-lpng -lz -lpthread -lreadline -lhistory

会出现以下错误:

/usr/local/lib/muesli/libfml.so: undefined reference to `gzwrite'
/usr/local/lib/muesli/libfml.so: undefined reference to `gzopen'
/usr/local/lib/muesli/libfml.so: undefined reference to `gzclose'
/usr/local/lib/muesli/libfml.so: undefined reference to `gzread'
collect2: error: ld returned 1 exit status

但请注意,-lz存在。之后,我添加了链接器选项--trace-symbol=以获取更多信息:

$ gfortran -o test_muesli_config_fml test_muesli_config_fml.o -fopenmp 
-Wl,--rpath,/usr/local/lib/muesli /usr/local/lib/muesli/libfml.so -lstdc++
-Wl,--rpath,/usr/lib /usr/lib/liblapack.so -Wl,--rpath,/usr/lib /usr/lib/libblas.so
-lpng -lz -lpthread -lreadline -lhistory -Wl,--trace-symbol=gzwrite

反过来给出结果:

/usr/local/lib/muesli/libfml.so: reference to gzwrite
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libz.so: definition of gzwrite
/usr/local/lib/muesli/libfml.so: undefined reference to `gzwrite'
/usr/local/lib/muesli/libfml.so: undefined reference to `gzopen'
/usr/local/lib/muesli/libfml.so: undefined reference to `gzclose'
/usr/local/lib/muesli/libfml.so: undefined reference to `gzread'
collect2: error: ld returned 1 exit status

所以,gzwrite位于libz.so,但链接器不使用它!

偶然的机会,我想删除-lpng选项(实际上,没有使用libpng库),我的问题解决了!为什么呢?

其次,我用另一个版本的GCC-4.7.3编译我的整个代码(由我自己编译 - 我习惯于测试编译器的许多版本),并且错误没有发生,即使使用两个{{ 1}}和-lpng

有什么想法吗?

此外,与另一个程序(使用libpng)进行不同的尝试会导致成功构建。

编辑于2013-10-08

我现在非常确定它是ubuntu-13.04中的一个错误:我已经尝试了另外两个Linux发行版(Fedora 16 - Ubuntu-10.04)并且链接器行为是标准的,不像上面第一个描述的那样我信息的一部分。

我打算在ubuntu社区报告此问题。问候。

于2013-10-09编辑

该错误已报告给https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/1237270

1 个答案:

答案 0 :(得分:0)

两种可能的修复(直到ubuntu不自行修复):

  1. 尝试在libpng.alibz.a中编译为静态库(它只能是一个临时解决方案,因为在大多数情况下静态库是邪恶的。)

  2. 从原始来源重新编译libpng,并在此处将libz.a编译为静态。