2009-03-17 19 views
40

私は、主に多数の静的ライブラリファイル(.a)からなる第三者ライブラリを持っています。これを1つの.aライブラリファイルにコンパイルすることはできますが、実際にはそれを1つの.so共有ライブラリファイルにする必要があります。静的ライブラリを共有ライブラリに変換しますか?

固定.aファイルを共有ファイル.soに変換する方法はありますか?または、より一般的には、数多くの静的な.aファイルといくつかの.oオブジェクトファイルを1つの.soファイルに結合する良い方法はありますか?

答えて

34

は、この(もちろん、適切な-L年代で)

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

それをしませんか?

+3

gcc -sharedを使用すると、私は-fPICを使用して再コンパイルした後でしか操作を実行できませんでした。正しい方向に私を指してくれてありがとう! –

17

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

+2

十分にサポートされているターゲットでは、 'PIC'は共有ライブラリコードには必須ではありません。パフォーマンスの低下を犠牲にして、メモリをより効率的に使用できるようになります(少数ではなく、大多数のページを共有できます)。 –

+3

一部の条件で-fPICなどが見つからない場合はSegFaultになります。 –

9
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についてはよく分からないんだけど、グラムのために、私は、共有オブジェクト内の静的ライブラリからオブジェクトを含める--wh​​ole-アーカイブリンカオプションを追加する必要がありました++。 --no-whole-archiveオプションは、libc_static_lib.aとlibother_shared_object.soにリンクしたいが、megalib.soに全体を含めない場合に必要です。

+1

コマンドラインの最後に '-Wl - no-whole-archive'が必要です。 [質問の編集、ここ](http://stackoverflow.com/questions/7935421/linking-archives-a-into-shared-object-so)を参照してください。 – ofavre

1

ar -xは、.aの特定のオブジェクトに集中し、自分で何も追加したくない場合にも便利です。

4
ar -x lib***.a 
gcc -shared *.o -o lib***.so 
関連する問題