使用32位g ++在AIX上构建64位二进制文​​件

时间:2010-03-08 06:10:45

标签: c++ aix

我正在尝试使用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 ++编译器一起使用?


  3. 非常感谢您的快速反应和指出问题。

    以下是我正在使用的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 ++库(必需)吗?

1 个答案:

答案 0 :(得分: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吗?)