ユーザープログラムの制御フローを変更するプロジェクトに取り組んでいます。これにはllvmを使用しています。最後に、clang++ を使用して一連の .s ファイルを生成します。次に、g++ を使用してそれらをすべてマージします。この段階で多くのエラーが発生するため、(g ++の代わりに)clang ++を使用できません(これは現在の問題ではありません)
C プログラム (gcc および clang) の場合、問題なく動作しています。しかし、C++ ユーザー コード (g++、clang++) の場合、実行時に次のエラーが発生します。
g++ -O3 -rdynamic *.s -o main.exe -Wa,-Iressource -lstdc++ -lm -ldl
/tmp/ccUdIbL3.o:(.ctors+0x0): undefined reference to `global constructors keyed to a'
/tmp/cch9k7on.o: In function `global constructors keyed to a':
_GLOBAL__I_a.optin:(.text.startup+0x1): undefined reference to `__cxx_global_var_init'
/tmp/ccvYrG8J.o:(.ctors+0x0): undefined reference to `global constructors keyed to a'
/tmp/cccPFs4G.o:(.ctors+0x0): undefined reference to `global constructors keyed to a'
私のインターネットでの検索によると、ほとんどの人にとって、(clang++ の代わりに)clang を使用しているため、このエラーが発生しました。
クラン
clang --version clang バージョン 3.1 (ブランチ/release_31)
ターゲット: x86_64-unknown-linux-gnu
スレッドモデル: posix
g++
g++ --バージョン
g++ (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3
実際の問題がどこにあるのかわかりません。しかし、単純に clang++ を使用して *.s ファイルを生成し、次に g++ を (llvm パスなしで) 使用すると、正常に動作することがわかっています。llvm は最後まで文句を言わず、g++ は文句を言うので、実際のエラーがどこで発生したかはわかりません。前に述べたように、元のコードが (clang と gcc を使用して) "C" である場合、問題なく動作します。
続行方法や問題を解決するための解決策についてのヘルプをいただければ幸いです。
特に(このコンテキストで)につながる可能性があるもの
- __cxx_global_var_init への未定義の参照
- をキーとするグローバル コンストラクタ