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. AIX5.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

gcc / g ++ 4.1.1で動作する64ビットのlibstdc++をビルドするにはどうすればよいですか?

--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 に答える