加载使用SWIG创建的php扩展时未定义的符号

HC4*_*ica 7 php c++ swig shared-libraries libstdc++

我正在尝试加载使用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
Run Code Online (Sandbox Code Playgroud)

我试图加载的扩展名是命名的libtg.so,并使用以下命令编译:

g++ -shared libtg_wrap.o -o libtg.so
Run Code Online (Sandbox Code Playgroud)

其中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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

所以我不明白为什么它找不到符号.关于如何进一步调试这个的任何想法?

mar*_*log 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
Run Code Online (Sandbox Code Playgroud)

和链接器调用(注意 -lstdc 标志):

ld -shared ${OUTPUTDIR}/*.o -o ${OUTPUTDIR}/${NAME}.so -lstdc++
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你