私は大きなプロジェクトで働いています。そして今、リンクエラーが発生します。
このエラーは回避策で回避できますが、なぜ機能するのか理解できません。
これが私の問題に関連するファイル構造です:
事業 | -package_a | --a.cpp |--..。 | -package_b | --b.cpp | --c.cpp |--..。 | -package_others
package_aのすべての*.oはaaにパックされ、package_bの*.oはbaにパックされます。
"g++ -o exec -Bstatic b.a a.a ..."
バイナリを生成するために使用されます。
package_b / b.cppに、関数foo()を追加しました。
そしてpackage_a/a.cppで、私はこの関数を使用しました。
しかし、ここでは、aoでのfoo()の未定義の参照を示すリンクエラーが発生します
。foo()がすでにboにあることを(objdumpによって)確認できます。
linkコマンドをに変更すること"g++ -o exec -Bstatic a.a b.a ..."
で、バイナリを正常にビルドできます。リンカがリンケージリストの順序を気にすることを理解しました。ただし、これは大きなプロジェクトであり、プロジェクト構成を変更する権限がないため、元のリンク順序を維持する必要があることを理解してください。
次に、package_b / c.cppにダミー関数bar()を追加しました。これは、foo()を呼び出すだけで"g++ -o exec -Bstatic b.a a.a ..."
、リンクエラーなしでoriginalが実行されます。
この場合、同じパッケージにダミー関数を追加するだけで機能する理由を誰かに教えてもらえますか?
g++4.4.4とlinux2.6.18-194.el5を使用しています
コメントをいただければ幸いです