web-dev-qa-db-ja.com

ビルド中に静的ライブラリを共有ライブラリにリンクしますか?

GCC/Linuxで共有ライブラリを構築する際に問題があります。現在、この共有ライブラリはGCC/libtoolオプション「-shared」で作成されており、すべて正常です。

これで、共有ライブラリに必要ないくつかの機能を提供するため、この共有ライブラリに追加する必要がある2つの静的ライブラリ(.a-files)が追加されました。これらの静的ライブラリをオプション "-l"で追加しても効果はありません。その後、それらは.soファイルの一部ではなくなります。

では、GCC/libtoolがこれらの静的ライブラリのコードを共有ライブラリに実際に追加するように強制するにはどうすればよいですか?

ありがとう!

17
Elmi

この場合、リンカーに静的ライブラリ全体のコンテンツを共有ライブラリに含めるように命令するには、--whole-archiveリンカーオプションが必要です。

g++ -shared sample.o -o libSample.so -Wl,-whole-archive -lmylib1.a -lmylib2.a -Wl,-no-whole-archive

man ldから:

コマンドラインで-whole-archiveオプションの後に示されている各アーカイブについて、必要なオブジェクトファイルをアーカイブで検索するのではなく、アーカイブ内のすべてのオブジェクトファイルをリンクに含めます。これは通常、アーカイブファイルを共有ライブラリに変換するために使用され、すべてのオブジェクトを結果の共有ライブラリに強制的に含めます。このオプションは複数回使用できます。

Gccからこのオプションを使用する場合の2つの注意:最初に、gccはこのオプションを認識しないため、-Wl、-whole-archiveを使用する必要があります。次に、アーカイブのリストの後に-Wl、-no-whole-archiveを使用することを忘れないでください。これは、gccが独自のアーカイブのリストをリンクに追加するため、このフラグを使用したくない場合があるためです。それらにも影響します。

23
Dmitry Yudakov

-whole-archiveパラメータをforceに指定するだけで、ライブラリにライブラリを含めることができますが、一致しないシンボルから独自のニーズを推測します。

コマンドラインの静的ライブラリが、依存するオブジェクトファイルの後に来ることを確認してください。例:

g++ -Wl,-E -g -pipe -O2 -pipe -fPIC  myobjectfile.o mystaticlibrary.a -shared -o mylib.so
3
robert