加载使用 SWIG 制作的 php 扩展时未定义的符号
Undefined symbol when loading php extension made with SWIG
我正在尝试加载使用 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
在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)
所以我不明白为什么它找不到符号。关于如何进一步调试它的任何想法?
似乎在编译过程中的某个地方,编译器或链接器不知道 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 Profiler语言 - 使用 C++ 从 PHP 扩展获取客户端 IP 和 URL
- 文件写入在PHP扩展c / c ++(linux)中不起作用
- 在PHP扩展中使用emalloc从线程时出现隔离错误
- 从C 中的PHP扩展中获取函数参数值
- PHP 7 C++扩展名.找不到指定的模块
- PHP扩展CLI崩溃
- 在 Ubuntu + PHP 扩展上编译 pHash
- 在Windows NTS模式下构建PHP扩展
- 构建php扩展时未定义的引用
- PHP 扩展中的分段错误
- 如何将 ZVAL 转换为 PHP 扩展的矢量
- PHP扩展-使用std::string的全局类
- 如何在php扩展中封装c++类
- 如何在PHP扩展中实例化全局C++类
- 简单的 Hello World PHP 扩展无法执行
- 带有 CUDA 函数的 PHP 扩展
- 如何在PHP扩展名中捕获上传的文件数据
- 加载使用 SWIG 制作的 php 扩展时未定义的符号
- 带有自定义C++库的 PHP 扩展
- 为什么php扩展开发与c++开发有如此大的不同