1

動的ライブラリを作成したいとしましょうdynamic.soが、私のコードは他の静的ライブラリに存在する関数を参照していますstatic.a。当然のことながら、オプションを使用してコンパイルおよびリンクするg++と、参照される関数が、実行時に と一緒にリンクする必要がある他の動的ライブラリに実装されることが期待されます。つまり、(モジュロシンタックス) をしてくれればそれでいいのです。-shareddynamic.sodynamic.so-l static

しかし、その他のライブラリは実際には静的なものなので、それはできません。メインプログラムのコンパイル時にも静的ライブラリをリンクできないと仮定しましょうが、動的ライブラリのみを使用することを余儀なくされています。したがって、私が本当に望んでいるのは、参照された関数からコンパイルされたコードを in に含めることstatic.aですdynamic.so

関連する質問に対するこの回答--whole-archiveは、オプションを使用して に含めることstatic.aを提案していますdynamic.so。しかし、私の場合static.aは巨大です。そして、私は本当にそのすべてを必要としません.1つの関数定義だけが必要です.

別の質問に対するこの回答は、コンパイル時に静的ライブラリにリンクすると、実際に参照されるコードのみがバイナリに含まれることを意味することを説明しています。これはまさに、単一の関数参照でやりたいことです! そこに静的アーカイブ全体を入れたくありません。

しかし、どうすればそれを達成できますか?の必要な部分だけを含めるにはどうすればよいstatic.aですdynamic.soか?

4

1 に答える 1

1

必要はありません: 次のよう--whole-archiveにリンクするだけdynamic.soです:

gcc -shared -fPIC -o dynamic.so $(OBJS) -lstatic

これは、動的に取り込まれます。リンカが必要とするものはすべて、この説明libstatic.a.を参照して、その理由を理解してください。

1 つの問題は、libstatic.aがコンパイルされていないこと-fPICです。32 ビットx86/Linuxでは、それは引き続き機能します (ただし、複数のプロセスがライブラリを使用している場合、ライブラリは RAM をあまり節約しません)。では、 fPICx86_64以外のコードを共有ライブラリにリンクすることはできないため、 で再構築する必要があります-fPIC

于 2011-12-07T05:34:08.533 に答える