2012-04-30 21 views
7

で作られたPHP拡張モジュールをロードするとき、私はPHP拡張モジュールをロードしようとしているがSWIGを使用しますが、PHPの起動時に、私は次のエラーを取得しています作られましたlibtg.soを命名して、コマンドでコンパイルされました:libtg_wrap.oはSWIGによって生成されたラッパーコード用のオブジェクトファイルである未定義シンボルSWIG

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

欠落シンボル__gxx_personality_v0は、次のコマンドから明らかなように、libstdc++.soに見出される:

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

libstdc++.soは、次のコマンドから明らかなように、libtg.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) 

のでドンなぜそれがシンボルを見つけることができないのか分からない。どのように私はこれをさらにデバッグすることができますか?

答えて

1

どこかにあなたのコンパイル処理では、コンパイラやリンカは、C++ソースを認識していなかったようです。

swig(php拡張機能を作成する)を試したときに、私はあなたのケースに便利なMakefileを作成しました。あなたのプロジェクトに合わせてカスタマイズして試してみてください。

は、私はSWIGコマンドに「-C++」オプションを指定する必要がありましたか参照してください。また、ソースファイルには.cpp拡張子を付けて、リンカーフラグに "-lstdC++"を追加してください。

重要なものは(-C++オプションに注意してください)SWIGの呼び出しでなければなりません:

${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++ 

は、それが

を役に立てば幸い
+0

興味深いことに、それはうまくいった!以前は 'ld'ではなく' g ++ 'を直接使っていました...違いは何ですか? – HighCommander4

+0

実際には違いはありません.g ++を使用してリンクすることができます。あなたが.oファイルをどのようにコンパイルしたか、あるいはswigコマンドや他の詳細をどのように呼び出すのかを示していないので、私ははるかに詳しく言うことはできませんが、うまくいきました! :) – marcelog

+0

の.oファイルは 'G ++ \' PHP-config5 --includes \ '-c -fPIC -std = C++ 0X libtg_wrap.cpp'でコンパイルし、SWIGコマンドはSWIG -php'として呼び出されました - C++ libtg.i'。 – HighCommander4

関連する問題