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!

.oファイルの代わりにファイルを使用すると、次の.aようになります。

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

私は何を間違っていますか?これを行う正しい方法は何ですか?

4

2 に答える 2

5

簡単に言うと、共有ライブラリ (PHP 拡張機能は特殊なケースです) は静的ライブラリに依存できません。

実際、それは完全に真実ではありません。スタティック ライブラリが位置独立コード (PIC) としてビルドされている限り、共有ライブラリからの使用は機能します。明示的にリンクしたファイルの未定義シンボルを満たすために必要な.oアーカイブのファイルはすべて、取り込まれて共有ライブラリ ファイルの一部になります。.o.so

PIC 以外の.oファイルを共有ライブラリにリンクすると、一部のアーキテクチャ (i386 など) でも動作しますが、移植性がありません (x86_64 では動作しません)。

あなたがすべきことについては、可能であれば、中間ファイルを忘れて、すべてのファイルを拡張子のファイルに明示的に.aリンクします。これはクリーンでシンプルです。または、すべてのファイルが PIC として (つまり、オプションを使用して)ビルドされていることが確実である限り、今までと同じように実行し続けることもできます。.o.so-fPIC

私がしないのは、拡張機能.soのメイン.soファイルが依存する追加のファイルを作成してインストールすることです。これが行うことは、肥大化を引き起こし、読み込み時間を増やし、展開/統合で多くの問題を引き起こすことだけです.

于 2012-04-24T02:30:52.857 に答える
1

共有ライブラリを静的ライブラリにリンクすることはできません (自分が何をしているのかを本当によく知っている場合を除きます)。やらないでください。

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

私は一度同じ問題に直面しましたが、確認できるmakeファイルのリンクフラグを修正することで解決しました

「警告: 静的ライブラリに対する共有ライブラリのリンクは移植できません」の意味は何ですか?

于 2012-04-24T04:47:36.187 に答える