これは古くからの質問のようです。
次の依存関係を持つ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回書き込む必要があります。