我正在尝试加载使用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++.so
中引用了{p> 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)
所以我不明白为什么它找不到这个符号。关于如何进一步调试这个的任何想法?
答案 0 :(得分: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++
希望有所帮助