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

标签 linux gcc 32bit-64bit autotools libtool

首先,我想让你知道这是我在 StackOverflow 上的第一篇文章,所以我希望我不会问一个非常愚蠢的问题来出丑。几天来我一直在谷歌上搜索这个问题,但到目前为止我找不到任何答案。

情况是这样的:

我正在开发一个使用 autotools 管理的 C++ 项目。目标平台为RHEL5 64bit,安装了两个版本的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++.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

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

干杯

最佳答案

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

关于linux - 安装多个版本的 gcc 时,libtool 与 64 位目标平台上的 32 位版本的 libstdc++.so 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15782420/

相关文章:

windows - 为什么在 64 位 Windows 上 64 位 DLL 转到 System32,而 32 位 DLL 转到 SysWoW64?

linux - 将 jiffies 转换为毫秒

linux - 如何设置从互斥锁获取锁的优先级?

ubuntu - 在 Ubuntu 中的 32 位上交叉编译 64 位程序时缺少包含 "bits/c++config.h"

linux - 如何使g++正确使用我自己的glibc构建的 header ?

c - 如何更改 GCC 中的默认搜索路径?

powershell - 在 SQL Server 代理上运行 32 位 Powershell 脚本

linux - 定义的 Linux 发行版的哪些命令在 Docker 容器中可用?

java - 在 Windows 7 中运行进程并获取其 ID

c++ - 如何在 gcc 编译器的 c/c++ 中获取运行的可执行文件名称