2010-03-08 148 views
0

我正尝试使用32位g ++编译器从C++代码构建64位二进制文​​件。 我收到以下错误,而建设:在AIX上使用32位g ++构建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 
[[email protected] /] 
=> 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和++被构造/与--disable-aix64内置克,没有可用的64位STD库(例如:的libstdC++)。

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

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

我需要重建GCC和G ++而没有--disable-aix64标志吗?如果是的话,可否请您指出解释如何构建的链接?

我们不能只建立libstdC++库(必需)吗?

回答

0

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

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

请注意,GCC(或G ++)非常有意地使用与其他编译器不同的name-mangling方案 - 因为它与其他编译器做了各种不同的事情(例如异常处理,类布局等)。您无法将使用原生XLC编译器编译的代码与使用G ++编译的代码可靠链接。但是,你似乎并没有在这里做。

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

你似乎只是缺少符号;你没有不匹配的32位和64位目标文件或库或其他。所以,你很接近 - 还不够。

(是否仍然支持AIX 5.2?您是否打算迁移到5.3或6.1?)