web-dev-qa-db-ja.com

静的ライブラリを共有ライブラリに変換しますか?

主に多数の静的(.a)ライブラリファイルで構成されるサードパーティライブラリがあります。これを単一の.aライブラリファイルにコンパイルできますが、単一の.so共有ライブラリファイルである必要があります。

静的.aファイルを共有.soファイルに変換する方法はありますか?または、より一般的には、膨大な数の静的.aファイルをいくつかの.oオブジェクトファイルと組み合わせて単一の.soファイルにする良い方法はありますか?

50
Eli Courtwright

これを行います(もちろん、適切な-Lを使用)

gcc -shared -o megalib.so foo.o bar.o -la_static_lib -lb_static_lib

しませんか?

40
dicroce

静的ライブラリ内のオブジェクトが-fPICなどを使用せずにコンパイルされた場合、これを行うことはできません。

23
vitaly.v.ch
g++ -shared -o megalib.so foo.o bar.o -Wl,--whole-archive -la_static_lib -lb_static_lib -Wl,--no-whole-archive -lc_static_lib -lother_shared_object

Gccについてはわかりませんが、g ++の場合、--whole-archiveリンカーオプションを追加して、共有ライブラリに静的ライブラリのオブジェクトを含める必要がありました。 libc_static_lib.aとlibother_shared_object.soにリンクするが、それらを全体としてmegalib.soに含めない場合は、-no-whole-archiveオプションが必要です。

17
Calm
ar -x lib***.a
gcc -shared *.o -o lib***.so
8

ar -xは、.asの特定のオブジェクトに焦点を合わせたい場合や、自分で何かを追加したくない場合にも役立ちます。

例:

ar -x lib***.a
gcc -shared *.o -o lib***.so