0

これは古くからの質問のようです。

次の依存関係を持つjuggleという名前の実行可能ファイルがあるとします。

ジャグリング→libfoo.a→libbar.a

次に、次のようなリンクコマンドを作成する必要があります。

g++ -o juggle juggle.cpp -lfoo -lbar

だがしかし:

g++ -o juggle juggle.cpp -lbar -lfoo

この問題は、.so(たとえば、libpickle.so)をリンクするときにも発生します。lib listを不適切に記述した場合、barのコードはpickleになりませんが、リンクは成功します。libpickle.soを動的にロードしようとした場合にのみ、バーを見逃したことに気付くでしょう。

これは非常に単純化された例です。現実の世界では、リンクするために非常に多くのライブラリ(多くは私たちのチームからのもの)に常に直面しており、ライブラリの依存関係の順序を覚えておくのは負担になる可能性があります。この負担をかけないコンパイラ(Visual C ++)が他にもあるので、「負担」と言います。

したがって、リンカコンポーネントを常に2回記述するのがベストプラクティスだと思います。

g++ -o juggle juggle.cpp -lfoo -lbar -lfoo -lbar

また、これは循環依存が存在する場合にも機能します。

誰かが私と同じ考えを持っていますか、それともより良い解決策ですか?

編集:リンカーコンポーネントを2回記述しただけでは、必ずしもリンクが成功するとは限らないことにようやく気づきました。A-> B-> Cの依存関係を想定し、ライブラリをCBAの順にリストすると、CBAを3回書き込む必要があります。

4

2 に答える 2

3

もう1つのオプションは、リンカー--start-group--end-groupオプションを使用して、循環依存関係を持つライブラリーのグループを指定することです。

詳細については、このSOの回答を参照してください。

于 2012-05-07T01:35:00.667 に答える
2

提示した-l選択肢の中で、依存関係が順番に解決されるように、オプションを正しい順序で記述することをお勧めします。循環ライブラリの依存関係がある場合(これは避ける必要があります)にのみ、-lオプションで同じライブラリについて2回言及する必要があります。

于 2012-05-07T01:27:56.087 に答える