如何诊断此运行时符号未找到错误:_ZNKSt13runtime_error4whatEv?适用于一个Linux版本,但不适用于另一个版本

时间:2014-08-11 17:18:33

标签: php c++ c linux linker-errors

背景:我正在使用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。

0 个答案:

没有答案