背景:我正在使用boost库编写C和C ++中PHP的扩展。 C扩展钩子调用了一些extern“C”'ed C ++代码。
我正在获取my_extension.so:未定义的符号:第0行的未知中的 _ZNKSt13runtime_error4whatEv
我认为发生的事情(我可能是错的)是C ++代码中的一个例外,它被抛回到调用它的C代码,从而窒息。虽然我不确定,因为我只是用try / catch(...)包装了所有的C ++代码,但这仍然在发生。
另一件事是我没有在CentOS 5.6上得到这个错误,但我确实在CentOS 6.5上得到它,甚至在6.5上编译这个扩展。我确实从6.5的源代码构建了php,所以也许我错过了一个库? Php否则工作正常。
我不知道如何对此进行故障排除,因为PHP决定不加载此库然后继续运行。 gdb甚至没有抓住它。
这是确切的错误:
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/php54/lib/php/extensions/no-debug-non-zts-20100525/my_extension.so' - /usr/local/php54/lib/php/extensions/no-debug-non-zts-20100525/my_extension.so:
undefined symbol: _ZNKSt13runtime_error4whatEv in Unknown on line 0
修改 如果我将我的扩展链接到一个带有main()的简单可执行文件并调用我的一些C ++方法,它可以正常工作。
ldd显示对libstdc ++的依赖。所以在我的测试可执行文件中,但不在我的共享库my_extension.so中。我不知道如何让它在.so
中具有这种依赖性编辑2
我发现共享库是由cc而不是g ++组合在一起的。如果我用g ++手动创建共享库,一切正常。
# cc -shared src/.libs/all_my_dot_o_files.o -Wl,-soname -Wl,my_extension.so -o .libs/my_extension.so
VS。
# g++ -shared src/.libs/all_my_dot_o_files.o -Wl,-soname -Wl,my_extension.so -o .libs/my_extension.so
所以我只需要弄清楚如何使这个php autoconf cr @ p使用g ++而不是cc。