0

我正在尝试使用 32 位 g++ 编译器从 C++ 代码构建 64 位二进制文​​件。我在构建时遇到以下错误:

=> /usr/local/bin/g++ -shared -maix64 -fPIC -Wl,-bM:SRE -Wl,-bnoentry -Wl,-bE:gcc_shr_lib.so.exp -o gcc_shr_lib.so gcc_shr_lib.o -L/usr/local/lib
ld: 0711-319 WARNING: Exported symbol not defined: gcc_whereAmI
ld: 0711-317 ERROR: Undefined symbol: typeinfo for std::bad_alloc
ld: 0711-317 ERROR: Undefined symbol: __gxx_personality_v0
ld: 0711-317 ERROR: Undefined symbol: vtable for std::exception
ld: 0711-317 ERROR: Undefined symbol: vtable for std::bad_alloc
ld: 0711-317 ERROR: Undefined symbol: .std::ios_base::Init::Init()
ld: 0711-317 ERROR: Undefined symbol: .std::ios_base::Init::~Init()
ld: 0711-317 ERROR: Undefined symbol: .operator new(unsigned long)
ld: 0711-317 ERROR: Undefined symbol: .operator delete(void*)
ld: 0711-317 ERROR: Undefined symbol: ._Unwind_Resume
ld: 0711-317 ERROR: Undefined symbol: .__cxa_get_exception_ptr
ld: 0711-317 ERROR: Undefined symbol: .__cxa_begin_catch
ld: 0711-317 ERROR: Undefined symbol: std::cout
ld: 0711-317 ERROR: Undefined symbol: .std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
ld: 0711-317 ERROR: Undefined symbol: std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)
ld: 0711-317 ERROR: Undefined symbol: .std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))
ld: 0711-317 ERROR: Undefined symbol: .std::bad_alloc::~bad_alloc()
ld: 0711-317 ERROR: Undefined symbol: .__cxa_end_catch
ld: 0711-317 ERROR: Undefined symbol: .__register_frame_info_table
ld: 0711-317 ERROR: Undefined symbol: .__deregister_frame_info
ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.
collect2: ld returned 8 exit status

看来我的构建系统需要 64 位 libstdc++。有人可以解决这个问题吗?

  1. 可以在 AIX 5.2 上使用 32 位 g++ 编译器构建 64 位二进制文​​件吗?

  2. 我应该从哪里获得 64 位 libstdc++?这个 64 位 libstdc++ 可以与 32 位 g++ 编译器一起使用吗?


非常感谢您的快速回复和指出问题。

以下是我正在使用的 GCC/G++ 版本:

=> gcc -v
Using built-in specs.
Target: powerpc-ibm-aix5.2.0.0
Configured with: ../gcc-4.1.1/configure --disable-aix64 --disable-nls
Thread model: aix
gcc version 4.1.1
[tsivaram@maroon /]
=> g++ -v
Using built-in specs.
Target: powerpc-ibm-aix5.2.0.0
Configured with: ../gcc-4.1.1/configure --disable-aix64 --disable-nls
Thread model: aix
gcc version 4.1.1

由于 gcc 和 g++ 是用 配置/构建的--disable-aix64,因此没有可用的 64 位 STD 库(例如:libstdc++)。

AIX version i am using:
=> uname -a
AIX maroon 2 5 000663FC4C00
[tsivaram@maroon /]
=> oslevel
5.2.0.0
[tsivaram@maroon /]
=> oslevel -r
5200-05

如何构建 64 位 libstdc++,它应该与 gcc/g++ 4.1.1 一起使用?

我是否需要在没有--disable-aix64标志的情况下重建 GCC 和 G++?如果是的话,你能指点我一个解释如何构建的链接吗?

我们不能只构建 libstdc++ 库(必需)吗?

4

1 回答 1

0

您似乎正在构建共享库而不是可执行文件。

只要机器上提供相关的 64 位库,您的 G++ 本身是 32 位还是 64 位二进制文​​件都无关紧要 - 它应该能够生成 32 位和 64 位对象文件(以及共享库和可执行文件等)。

请注意,GCC(或 G++)非常刻意地使用与其他编译器不同的名称修饰方案——因为它在做各种事情(例如异常处理、类布局等)方面与其他编译器不同。您无法可靠地将使用本机 XLC 编译器编译的代码与使用 G++ 编译的代码链接起来。但是,您似乎没有在这里这样做。

您应该在 /usr/local/lib 下查看以 64 位 C++ 库的方式可以找到什么;您可能需要在命令行中提及正确的目录和共享库名称。或者,将“-v”标志添加到命令中并查看实际执行的内容。

您似乎只是缺少符号;您没有不匹配的 32 位与 64 位目标文件或库或其他任何东西。所以,你已经接近了——只是还没有到。

(AIX 5.2 是否仍受支持?您不应该计划迁移到 5.3 或 6.1 吗?)

于 2010-03-08T06:24:48.360 回答