2009-05-27 10 views
28

私はa.soとb.soを持っていると言う。 aとbによってエクスポートされたすべての関数を持つ単一の共有ライブラリとしてc.soを生成できます。もちろん、すべてのイントラ依存関係を解決できますか?a.soによって呼び出されたb.soのすべての関数とは逆です。複数の.so共有ライブラリをマージする

私は

gcc -shared -Wl,soname,c.so -o c.so a.so b.so

を試してみましたが、それは動作しません。私はそれができません

gcc -shared -Wl,soname,c.so -o c.so a.a b.a

おかげで実際に

+0

私は私が単一のものとして、すべての小さなライブラリを表示することができますGROUPでライブラリスクリプトを使用するために頼って終わりではなく、 1つのソフトウェアが適切な "サブ"ライブラリにリンクすることができます。 – Metiu

答えて

38

AIX以外のすべてのUNIXenでは、複数の共有ライブラリを1つにマージすることは実際には不可能です。リンカは.soを「最終的な」製品と見なします。

しかし、.soのにアーカイブをマージすることは問題にはならない。

gcc -shared -o c.so -Wl,--whole-archive a.a b.a -Wl,--no-whole-archive 
+0

有用なフラグありがとうございました:whole-archive! –

+0

アーカイブの順番はここで重要ですか?たくさんの.aファイルがある場合は、* .aを使用できますか? – Raj

+1

@Rajいいえ、注文は問題ではありません。すべてが完全に含まれます。 '* .a'でシンボルの再定義がない場合、' * .a'はちょうど動作します(TM)。 –

7

をaの化合物。表とb.a(a.oとb.oを変更するべきではないもの)でa.oとb.oアーカイブ、および行う場合にも、同じ

は行きます。

SOライブラリは、リンクに必要な再配置情報を含まない最終製品です。

両方のライブラリのソースファイルまたはオブジェクトファイルにアクセスできる場合は、それらから結合されたSOをコンパイル/リンクするのは簡単です。

+1

"両方のライブラリのソースファイルまたはオブジェクトファイルにアクセスできる場合は、それらから結合されたSOをコンパイル/リンクするのは簡単です。 ---どうしたらいいですか?具体的には、Androidプラットフォーム上。 –

関連する問題