当安装多个版本的gcc时,libtool在64位目标平台上链接32位版本的libstdc++.so。

13

首先,我想告诉你这是我在StackOverflow上的第一篇文章,所以我希望我不会因为问一个非常愚蠢的问题而变得很傻。 我已经搜索了几天这个问题,但到目前为止都没有找到答案。

这里是情况:

我正在使用autotools管理的C++项目。目标平台是安装了两个版本gcc的RHEL5 64位系统:

  • /usr目录下安装了gcc 4.1.2
  • /local/opt/gcc-4.3.5目录下安装了gcc 4.3.5

当我使用默认的gcc版本(4.1.2)构建我的项目时,一切都很好,但是当我切换到gcc 4.3.5时,在链接时出现以下错误:

/local/opt/gcc-4.3.5/lib/../lib/libstdc++.so: could not read symbols: File in wrong format
collect2: ld returned 1 exit status

看起来libtool在命令行中硬编码了32位版本的libstdc++.so路径,而应该是64位版本。 更准确地说,失败的libtool调用是:

似乎libtool在命令行中将32位版本的libstdc++.so路径硬编码了,而应该使用64位版本。 具体来说,失败的libtool调用如下:

/bin/sh ./libtool --tag=CXX --mode=link g++  -m64   -o libfoo.la -rpath /local/opt/foo/lib  src/foo/libfoo_la-bar1.lo src/foo/libfoo_la-bar2.lo

它由libtool翻译成:

g++ -shared -nostdlib
/usr/lib/../lib64/crti.o
/local/opt/gcc-4.3.5/lib/gcc/x86_64-unknown-linux-gnu/4.3.5/crtbeginS.o
src/foo/.libs/libfoo_la-bar1.o
src/foo/.libs/libfoo_la-bar2.o
-Wl,--rpath
-Wl,/local/opt/gcc-4.3.5/lib/../lib
-Wl,--rpath
-Wl,/local/opt/gcc-4.3.5/lib/../lib
-L/local/opt/gcc-4.3.5/lib/gcc/x86_64-unknown-linux-gnu/4.3.5
-L/local/opt/gcc-4.3.5/lib/gcc/x86_64-unknown-linux-gnu/4.3.5/../../../../lib64
-L/lib/../lib64
-L/usr/lib/../lib64
-L/local/opt/gcc-4.3.5/lib/gcc/x86_64-unknown-linux-gnu/4.3.5/../../..
/local/opt/gcc-4.3.5/lib/../lib/libstdc++.so
-lm -lc -lgcc_s
/local/opt/gcc-4.3.5/lib/gcc/x86_64-unknown-linux-gnu/4.3.5/crtendS.o
/usr/lib/../lib64/crtn.o
-m64 -Wl,-soname -Wl,libfoo.so.0 -o .libs/libfoo.so.0.0.0

我应该说明一下,我用于从默认的gcc切换到gcc 4.3.5的方法如下:

$ export PATH=/local/opt/gcc-4.3.5/bin:$PATH
$ export LD_LIBRARY_PATH=/local/opt/gcc-4.3.5/lib:/local/opt/gcc-4.3.5/lib64:$LD_LIBRARY_PATH
$ export GCC_HOME=/local/opt/gcc-4.3.5

我对所有这些工具都很陌生,所以我怀疑我在做错什么。如果有人能给我提示如何修复这个问题,我将非常感激。

谢谢!


这看起来很奇怪。我本来期望gcc-4.3.5会为64位库设置硬编码路径。尝试使用以下命令:./configure CC="/local/opt/gcc-4.3.5/bin/gcc-4.3.5 -m64" - Brett Hale
正如你所担心的那样,将CC=...替换为CXX=...并没有解决问题。-B<prefix>也没有帮助,这是可以预料的,因为libstdc++.so的完整路径在命令行中已经明确提到了。顺便说一下,我不熟悉-B选项,所以我把它放在了LDFLAGS中--我不知道这是否符合你的意思。无论如何,感谢你的时间。 - Nicolas
Libtool使用.la/.lo文件来确定要链接的适当库。在这种情况下,请检查沿着库路径的libstdc++.la文件,因为libtool将找到它并使用它来查找libstdc++.so。 - Brian
你在/local/opt/gcc-4.3.5/lib中真的有64位版本的libstdc++吗?你是自己编译和安装的gcc-4.3.5吗(libstdc++的位置表明你没有)?否则,你可能会有32位专用和双ABI库的混合问题。 - Fabel
尝试将export LD_LIBRARY_PATH=/local/opt/gcc-4.3.5/lib:/local/opt/gcc-4.3.5/lib64:$LD_LIBRARY_PATH更改为export LD_LIBRARY_PATH=/local/opt/gcc-4.3.5/lib64:/local/opt/gcc-4.3.5/lib:$LD_LIBRARY_PATH。此外,我不明白为什么您要同时提供lib和lib64的路径,我认为只提供lib64就足够了。 - Michael Kruglos
显示剩余2条评论
1个回答

7
我刚刚找到了自己问题的答案:除了正确设置LD_LIBRARY_PATH之外,我还需要在configure脚本中传递参数LDFLAGS=-L/local/opt/gcc-4.3.5/lib64。 感谢大家的帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接