2013-02-15 23 views
15

GCC/Linuxで共有ライブラリを構築する際に問題があります。現在のところ、この共有ライブラリはGCC/libtoolオプション "-shared"で作成されており、すべて正常です。ビルド中に静的ライブラリを共有ライブラリにリンクしますか?

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

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

ありがとうございます!

+0

あなただけのgccの建物オプションに静的ライブラリの完全なパスを追加することができます実行可能ファイルを作成する場合は、 'gcc -Wall -g live_mystuff.c -o my_app /usr/local/src/ffmpeg/libswscale/libswscale.a -lpthread -lbz2 -lm -lz -lfaac -lmp3lame -lx264 -lfaad ...'それは次のようなものです。共有ライブラリの作成にも使用できます。それを試してみてください。 – fritzone

+0

".soファイルの一部ではない"ことをどのように知っていますか? –

+0

@fritzone:問題なく動作する実行ファイルについては、共有ライブラリのために実行する必要があります。 – Elmi

答えて

21

この場合、リンカーに、静的なlibsのコンテンツ全体を共有ライブラリに含めるように指示するには、リンカーオプションが必要です。 --whole-アーカイブオプションの後に、コマンドライン上で述べた各アーカイブに対して

、リンクでアーカイブ内のすべてのオブジェクトファイルを含めるのではなく、検索:man ldから

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

必要なオブジェクトファイルのアーカイブ。これは、通常、アーカイブファイルを共有ライブラリに変換し、すべてのオブジェクトを結果としての共有ライブラリに含めるために使用されます。このオプションは複数回使用できます。

gccからこのオプションを使用する場合、2つの注意点があります。まず、gccはこのオプションについて知らないため、-Wl、-whole-archiveを使用する必要があります。次に、-Wl、-no-whole-archiveをアーカイブのリストの後に使用することを忘れないでください。これは、gccが独自のアーカイブリストをリンクに追加するためです。

+0

が '-WL、'の後ろにボットのダッシュを使用しなければなりませんでした。 – stefanct

2

あなただけのライブラリが含まれるようにリンカに--whole-アーカイブパラメータを必要とするが、比類のないシンボルから、独自のニーズを推測することができるはずです。

コマンドライン上の任意の静的ライブラリは、その依存オブジェクト・ファイルなどの後に来ることを確認します。

g++ -Wl,-E -g -pipe -O2 -pipe -fPIC myobjectfile.o mystaticlibrary.a -shared -o mylib.so 
関連する問題