2012-04-24 8 views
4

私はPHP拡張モジュール内で使用するスタティックライブラリを作成しようとしています。これを行うには、.cファイルをgcc -c file.c -o file.oでコンパイルし、.o個のファイルを取得しています。次に、ar rcs lib.a *.oを使用して、コンパイルされたすべてのオブジェクトを.aファイルにアーカイブします。スタティックライブラリの作成

これを実行した後、私のPHP拡張モジュールをコンパイルするとき、私は、この.aファイルを参照するんだけど、私は次のエラーを取得する:

*** Warning: Linking the shared library <extension>.la against the 
*** static library lib.a is not portable! 

私が代わりに.aファイルの.oファイルを使用している場合は、私が取得:

*** Warning: Linking the shared library <extension>.la against the non-libtool 
*** objects file1.o file2.o is not portable! 

これを行う正しい方法は何ですか。

答えて

5

短い答え:共有ライブラリ(PHP拡張モジュールは特別なケースです)は静的ライブラリに依存できません。

実際、これは完全に真実ではありません。静的ライブラリが位置独立コード(PIC)として構築されている限り、共有ライブラリからそのライブラリを使用すると動作します。 .o.oファイル内の未定義シンボルを満たすには、.soを共有ライブラリファイルの一部にするためにアーカイブからのファイルが必要です。共有ライブラリに非PIC .oファイルをリンク

も(i386のような)一部 archsを上で動作しますが、それはポータブルではありません(とx86_64上では動作しません)。

可能であれば、中間の.aファイルを忘れ、すべての.oファイルを明示的に拡張子のファイル.soにリンクしてください。これはきれいでシンプルです。または、すべてのファイルがPIC(つまり、-fPICオプション付き)として構築されている限り、あなたがやっているやり方でそれをやり続けることができます。

私がしないことは、.soファイルを作成してインストールし、拡張子のメインファイル.soが依存することになります。これはすべて膨らみを作り出し、読み込み時間を増やし、展開/統合に多くの問題を引き起こします。

+0

見ることができますmakeファイル内のいくつかのリンクフラグをcorrctingことによってそれを解決している:'警告:共有ライブラリ .laと非libtoolオブジェクトfile1.o file2.oをリンクすると、移植性がない! – rid

+2

libtoolをまったく使用している場合、libtoolを使用してすべてを構築する必要があります。 –

+0

私は大好きですが、どうしたらいいのかわかりません。私は 'libtool'を使用していません.PHPです。 – rid

1

静的ライブラリに共有ライブラリをリンクすることはできません(実際にあなたが行っていることを本当によく知っていない限り)。それをしないでください。

最初の警告はlibtoolからのものです。それは、あなたが求めた操作が異なるシステム上で異なることを行い、それらのいくつかはおそらくあなたが望むものではないことを示しています。共有ライブラリと静的ライブラリに含まれるコードは、異なるコンパイラフラグでコンパイルする必要があるため、さまざまな方法で失敗することがよくあります。

私はかつて同じ問題に直面しているが、私はあなたが私が `.o`ファイルを使用している場合は、私が手

What is the meaning of “Warning: Linking the shared library against static library is not portable”?

関連する問題