2010-03-08 147 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?)