在 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 编译了我的整个代码(我自己编译——我习惯于测试许多版本的编译器),即使同时使用-lpng
和-lz
!
任何想法?
此外,对另一个程序(使用 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