2011-12-07 39 views
1

動的ライブラリdynamic.soを作成したいとしましょうが、私のコードは他の静的ライブラリstatic.aに存在する関数を参照しています。当然ながら、g++-sharedオプションをコンパイルしてリンクすると、dynamic.soは、実行時にdynamic.soと一緒にリンクする必要がある他のダイナミックライブラリで参照される関数が実装されることを期待します。言い換えれば、私が-l static(モジュロ構文)をしている限り、それは幸せです。静的ライブラリと動的ライブラリ - more C++ fun

しかし、他のライブラリは実際には静的ライブラリなので、私はそれを行うことはできません。私のメインプログラムのコンパイル時に静的ライブラリをリンクすることはできないと仮定しましょうが、私は動的ライブラリのみを使用するように強制されます。だから私が本当に望むのは、static.aの参照関数からコンパイルされたコードをdynamic.soに入れることです。関連する質問へ

This answerdynamic.sostatic.aを含める--whole-archiveオプションを使用することを提案しています。しかし、私の場合、static.aは巨大です。そして、私は本当にそれのすべてを必要としません、私はその1つの関数の定義が必要です。

This answer他の質問との違いは、コンパイル時に静的ライブラリにリンクすると、実際に参照されるコードのみがバイナリに含まれることです。まあ、これはまさに私の単一の関数参照のためにやりたいことです!私は本当にそこに静的なアーカイブ全体を望んでいません。

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

答えて

1

あなたは--whole-archiveは必要ありません。ただ、このようなあなたのdynamic.soをリンク:

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

これは、リンカはそれがある理由を理解するためにthis explanationを参照してくださいlibstatic.a.から必要dynamic.so何に引っ張ってきます。

libstatic.a-fPICなしでコンパイルされている可能性があります。 32ビットのx86/Linuxでは、それでも動作します(ただし、複数のプロセスで使用されている場合は、ライブラリによって多くのRAMが節約されません)。 x86_64では、非fPICコードを共有ライブラリにリンクすることはできませんので、-fPICで再構築する必要があります。

+0

恐ろしい!私は '-l'を自分自身に言及したことに注意してください。もう1回、gccの引数の順序が問題であるという事実に噛まれました...ありがとう! – Thomas

関連する問題