7

SWIG を使用して作成された PHP 拡張機能を読み込もうとしていますが、PHP の起動時に次のエラーが発生します。

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/20090626/libtg.so' - /usr/lib/php5/20090626/libtg.so: undefined symbol: __gxx_personality_v0 in Unknown on line 0

ロードしようとしている拡張機能には名前が付けられlibtg.soており、次のコマンドでコンパイルされています。

g++ -shared libtg_wrap.o -o libtg.so

libtg_wrap.o、SWIG によって生成されたラッパー コードのオブジェクト ファイルです。

次のコマンドから明らかなように、不足しているシンボル__gxx_personality_v0は にあります。libstdc++.so

$ nm -D /usr/lib/libstdc++.so.6 | grep __gxx_personality_v0
00000000000b9990 T __gxx_personality_v0

libstdc++.solibtg.so次のコマンドから明らかなように、で参照されています。

$ ldd libtg.so
linux-vdso.so.1 =>  (0x00007fff5f932000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f3fc937c000)
libm.so.6 => /lib/libm.so.6 (0x00007f3fc90f9000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f3fc8ee2000)
libc.so.6 => /lib/libc.so.6 (0x00007f3fc8b5f000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3fc98fc000)

そのため、シンボルが見つからない理由がわかりません。これをさらにデバッグする方法についてのアイデアはありますか?

4

1 に答える 1

1

コンパイル プロセスのどこかで、コンパイラまたはリンカーが c++ ソースを認識していなかったようです。

swig を (php 拡張機能を作成するためにも) 試したとき、あなたの場合に便利な次のMakefileを作成したので、プロジェクト用にカスタマイズして試してみてください。かなり簡単です。

swig コマンドに「-c++」オプションを指定する方法を参照してください。また、ソース ファイルの拡張子が .cpp であることを確認し、リンカー フラグに「-lstdc++」を追加してください。

重要なのは、swig の呼び出しです (-c++ オプションに注意してください)。

${OUTPUTDIR}/${NAME}_swig.cpp:
    ${SWIG} -outdir ${OUTPUTDIR} \
        -oh ${OUTPUTDIR}/${NAME}_swig.h \
        -o ${OUTPUTDIR}/${NAME}_swig.cpp \
        -c++ -php \
        ${NAME}.i

およびリンカーの呼び出し (-lstdc フラグに注意してください) :

ld -shared ${OUTPUTDIR}/*.o -o ${OUTPUTDIR}/${NAME}.so -lstdc++

それが役に立てば幸い

于 2012-05-02T20:28:17.630 に答える