4

サンプルの LLVM プログラムをコンパイルしようとしています。リンカー ステップは、このコマンドを使用します。

llvm-config-3.2 --ldflags --libs

その結果、次のコマンドが実行されます。

g++  -o bin/Debug/test-llvm obj/Debug/main.o   -L/usr/lib/llvm-3.2/lib  -lpthread -lffi -ldl -lm  (a boat load of LLVM libraries here)

ただし、リンクに失敗します。このようなエラーが発生します。

undefined reference to ffi_type_float

だから、私は最後にとを追加-lffi-ldlました。

g++  -o bin/Debug/test-llvm obj/Debug/main.o   -L/usr/lib/llvm-3.2/lib  -lpthread -lffi -ldl -lm  (a boat load of LLVM libraries here) -lffi -ldl

したがって、はい、コマンドに TWICE が表示されます...しかし、このように機能します。なんで?それらは、議論の前半で明確に参照されています。

4

3 に答える 3

4

コマンド ラインの後に表示される 1 つ以上のライブラリは、これらのライブラリの 1 つに定義されているシンボル-lffi-ldl参照します。ただし、リンカーは既にスキャンを終了libffiしてlibdlおり、これらのシンボルを再スキャンしません。この循環依存関係は、リストの最後にそれらの名前を再リストすることにより、リンカーにそれらのライブラリを再度スキャンさせることで解決できます。

よりスケーラブルな解決策は、--start-group archives --end-groupオプションを使用して、リンク先のライブラリを一覧表示することです。マニュアルページからの引用:

-( archives -)
--start-group archives --end-group アーカイブは、アーカイブ ファイルのリストである必要があります。それらは、明示的なファイル名または -l オプションのいずれかです。

指定されたアーカイブは、新しい未定義の参照が作成されなくなるまで繰り返し検索されます。通常、アーカイブは、コマンド ラインで指定された順序で 1 回だけ検索されます。後でコマンド ラインに表示されるアーカイブ内のオブジェクトによって参照される未定義のシンボルを解決するために、そのアーカイブ内のシンボルが必要な場合、リンカはその参照を解決できません。アーカイブをグループ化することにより、考えられるすべての参照が解決されるまで、すべてのアーカイブが繰り返し検索されます。

このオプションを使用すると、パフォーマンスが大幅に低下します。2 つ以上のアーカイブ間に避けられない循環参照がある場合にのみ使用することをお勧めします。

したがって、コマンドラインは次のようになります。

g++ -o bin/Debug/test-llvm obj/Debug/main.o -L/usr/lib/llvm-3.2/lib --start-group -lpthread -lffi -ldl -lm ... --end-group
于 2013-06-14T03:51:32.113 に答える
1

これらのライブラリを 2 回リンクする必要があるのはなぜですか

コマンドラインでのアーカイブライブラリの順序は重要であり、あなたのものは間違っているためです。

于 2013-06-14T03:52:06.797 に答える