gpt4 book ai didi

php - 加载使用 SWIG 制作的 php 扩展时 undefined symbol

转载 作者:可可西里 更新时间:2023-11-01 18:39:44 31 4
gpt4 key购买 nike

我正在尝试加载使用 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 生成的包装器代码的目标文件。

libstdc++.so 中找到了缺失的符号 __gxx_personality_v0,如以下命令所示:

$ 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)

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

最佳答案

似乎在您的编译过程中的某个地方,编译器或链接器不知道 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++

希望对你有帮助

关于php - 加载使用 SWIG 制作的 php 扩展时 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10391017/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com