2012-04-30 65 views
7

我试图加载使用痛饮做了一个PHP扩展由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_v0libstdc++.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) 

所以就不会看不出为什么它找不到符号。关于如何进一步调试的任何想法?

回答

1

似乎在编译过程中的某个地方,编译器或链接器不知道C++源代码。

当我尝试swig(也创建一个php扩展名)时,我创建了以下Makefile,这可能对您的情况很方便,因此您可能需要为您的项目定制它并尝试一下,这很直接。

请参阅我必须为swig命令指定“-C++”选项。另外,请确保源文件具有.cpp扩展名,并将“-lstdC++”添加到链接器标志中。

重要的东西应该是痛饮调用(请注意,-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++ 

希望它可以帮助

+0

有趣的是,这工作!以前我使用'g ++'来直接链接而不是'ld' ...我想知道有什么区别。 – 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