15

既存のシステムをWindowsからLinuxに移植しています。ビルドは複数の静的ライブラリで構成されています。libBのオブジェクトにシンボル(libAで定義)が見つからないというリンクエラーが発生しました。リンカーラインは次のようになりました

g ++ test_obj.o -lA -lB -o test

もちろん問題は、リンカがlibAからのシンボルを必要としていることを検出するまでに、すでにそれを通過しており、再スキャンしないため、シンボルが取得のために存在していても、単にエラーになることです。

私の最初のアイデアはもちろん、リンクを(-lB -lAに)スワップして、後でlibAをスキャンし、libAにあるlibBから欠落しているシンボルをピックアップすることでした。しかし、実際にはlibAとlibBの間に再帰的な依存関係があることがわかりました。Visual C ++リンカーがこれを何らかの方法で処理すると想定しています(デフォルトで再スキャンされますか?)。

私が検討したこれに対処する方法:

  • 共有オブジェクトを使用します。残念ながら、これはPICコンプライアンスを要求するという観点からは望ましくなく(これはパフォーマンスに敏感なコードであり、GOTを保持するために%ebxを失うと本当に害があります)、共有オブジェクトは必要ありません。

  • 問題を回避して、すべてのオブジェクトの1メガarを構築します。

  • 再帰的な依存関係を回避するためにコードを再構築します(これは明らかに正しいことですが、最小限の変更でこのポートを実行しようとしています)。

これに対処する他のアイデアはありますか?binutilsリンカーに、シンボルが欠落しているときにすでに調べたライブラリの再スキャンを実行するように説得する方法はありますか?

4

2 に答える 2

19

これを行うだけです:

g++ test_obj.o -lA -lB -lA       -o test

リンカがコマンドラインで最初のlibAを読み取ると、まだ誰も依存していないオブジェクト/シンボルを破棄します。たとえば、libBが必要とするすべてのシンボルは、test_obj.oではありません。したがって、libAを再度読み取るようにすると、それらのシンボルも取得されます。

于 2010-04-29T15:01:45.160 に答える
10

@nosは単純なソリューションを提供しますが、複数のライブラリが関係していて相互依存関係がより複雑な場合は拡張できません。問題を整理するには、をld提供します--start-group archives --end-group

あなたの特定の場合:

g++ test_obj.o --start-group -lA -lB --end-group -o test
于 2013-02-13T21:44:33.753 に答える