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

时间:2013-04-03 08:32:49

标签: linux gcc 32bit-64bit autotools libtool

首先,我想告诉你这是我在StackOverflow上的第一篇文章,所以我希望通过提出一个非常愚蠢的问题,我不会愚弄自己。我一直在谷歌上搜索这个问题几天了,到目前为止我找不到任何答案。

情况如下:

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

  • gcc 4.1.2安装在/ usr
  • gcc 4.3.5安装在/local/opt/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 ++的路径。所以在命令行中,它应该是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

我对所有这些工具都很陌生,所以我怀疑我做错了什么。如果有人能给我一个如何解决这个问题的线索,我将非常感激。

干杯

1 个答案:

答案 0 :(得分:6)

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