首先,我想告诉你这是我在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
我对所有这些工具都很陌生,所以我怀疑我在做错什么。如果有人能给我提示如何修复这个问题,我将非常感激。
谢谢!
./configure CC="/local/opt/gcc-4.3.5/bin/gcc-4.3.5 -m64"
- Brett HaleCC=...
替换为CXX=...
并没有解决问题。-B<prefix>
也没有帮助,这是可以预料的,因为libstdc++.so的完整路径在命令行中已经明确提到了。顺便说一下,我不熟悉-B
选项,所以我把它放在了LDFLAGS中--我不知道这是否符合你的意思。无论如何,感谢你的时间。 - Nicolasexport 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