7

私のプロジェクトは静的ライブラリlibA.aバージョン1に対してリンクしています。

この実行可能ファイルは、別の静的ライブラリBにもリンクしています。BはAにリンクされていますが、バージョン2です。

Aのバージョン1と2の両方のシンボルセットは同じです。プロジェクトとBの間でAと関係のある共有がないことがわかっている場合、これは機能する必要がありますか?

私はそれを手動でリンクすることができました、そしてそれはうまくいくようです(多分私が気付いていない落とし穴があるかもしれません)。

lib Bを共有オブジェクトにすることも、Aを共有オブジェクトとして使用することもできません。実は、Bを書いた人と話をしたので、Bが静的にAを使っていることしか知りません。

4

2 に答える 2

3

私は訂正される立場にありますが、慎重なコンパイルプロセスと objcopy の賢明な使用を通じて、あなたが望むものを達成できるようです。従うべき手順は次のとおりです。

  1. A のバージョン 2 をコンパイルします。
  2. ライブラリ B を A2 に対してコンパイルします。
  3. B と A2 を単一のライブラリ C にマージします (関連する議論については、このページを参照してください)。
  4. objcopy を使用して C2 を作成することにより、C に存在する A2 のすべてのシンボルをローカライズします。を使用objcopy --localize-symbols infile outfileし、詳細についてはこちらをご覧ください。
  5. A のバージョン 1 をコンパイルします。
  6. アプリをコンパイルします (P)。
  7. P A1 と C2 をリンクします。

実際にこれを行ったことはありませんが、すべての構成要素が整っているようです。ステップ 4 は、おそらく手動で競合するすべてのシンボルを特定する必要があるため、最も困難です。

于 2012-12-18T11:27:43.267 に答える
2

質問の「リンク」部分については、実際には静的ライブラリはリンクされていません。リンク手順は、最終的な実行可能ファイルを取得するためにのみ実行されます。

実際、A (バージョン 2) のヘッダーを使用してスタティック ライブラリ B をコンパイルしました。次に、実行可能ファイルを B ライブラリと A (バージョン 1) ライブラリの両方にリンクしました。

A の両方のバージョンでシンボルが同じである限り、コンパイルの問題はありません。ただし、実行可能ファイルは実際にはバージョン 1 の A のみを埋め込んで使用することを知っておく必要があります。

于 2012-12-18T11:20:08.757 に答える