Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查未混合的C++;构建PHP扩展时的符号? 我有一个用C++编写的PHP模块,它依赖于安装了一个C++库(Boost DATEJOTIME)。_C++_Automake_Php Extension_Name Mangling - Fatal编程技术网

如何检查未混合的C++;构建PHP扩展时的符号? 我有一个用C++编写的PHP模块,它依赖于安装了一个C++库(Boost DATEJOTIME)。

如何检查未混合的C++;构建PHP扩展时的符号? 我有一个用C++编写的PHP模块,它依赖于安装了一个C++库(Boost DATEJOTIME)。,c++,automake,php-extension,name-mangling,C++,Automake,Php Extension,Name Mangling,目前,在我的config.m4文件中,我正在检查库,如下所示: LIBNAME=boost_date_time LIBSYMBOL=_ZN5boost9gregorian9bad_monthD0Ev PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,, [ AC_MSG_ERROR([lib $LIBNAME not found. Try: sudo apt-get install libboost-dev]) ],[ -lstd

目前,在我的config.m4文件中,我正在检查库,如下所示:

  LIBNAME=boost_date_time
  LIBSYMBOL=_ZN5boost9gregorian9bad_monthD0Ev

  PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,,
  [
    AC_MSG_ERROR([lib $LIBNAME not found.  Try: sudo apt-get install libboost-dev])
  ],[
    -lstdc++ -ldl
  ])
现在,这在我当前的环境中工作,但我痛苦地意识到这可能会在库或编译器的不同版本上中断

我怎样才能让AutoCAD了解未被压缩的C++符号?< /P> 编辑:

我意识到检查损坏的名称是可怕的,但是否有某种方法可以检查“nm-C”返回的符号名称(例如boost::gregorian::bad_month等)


我找到了一些对AutoCADE命令AcLangLycPulsPLUSER()的引用,但是我不知道如何使用它,以及它是否适用于这里。

< P>在特定C++编译器的环境之外,没有“未被篡改的C++符号”。例如链接器和图书馆员。

< P>你需要为你想调用的Boost API函数提供一套C++包装。这些包装器需要用
extern“C”
声明,如下所示:

extern "C" 
void foo(int bar) 
{
...
}

您的PHP代码应该使用这些包装器,而不是直接调用C++方法。 编辑:既然您假设了

automake
的可用性,那么您可能计划编译Boost库作为安装的一部分。这使您可以选择探测名称损坏的结果。试着沿着这些线创建一个测试C++程序。strong>注意,这只需要编译;它不需要产生有效的结果

#include "boost/date_time/gregorian/greg_month.hpp"
int main( int argc, const char* argv[] )
{
   boost::gregorian::bad_month* xxxjunk = new boost::gregorian::bad_month;
   return 0;
}
在automake中,您需要编译此文件,然后通过

nm -C | grep "boost::gregorian::bad_month"
根据您的需要和挑剔程度,您可能希望进一步细化
grep
命令以查找字符串“
typeinfo for boost::gregorian::bad_month
”(请注意,这进一步增加了您对特定编译器实现的依赖性。)

这是一个可怕的想法——在公开的地方弄坏符号。你为什么一开始就需要这个


看到您的更新后,我不得不问,为什么不使用自定义规则来调用
nm
,获取此信息,并将此规则作为一项要求传递?如果
autoconf
提供了一个直接命令来检查对象文件中是否有符号,我会非常惊讶。

您可以使用类似的方法检查
AC\u TRY\u COMPILE

LIBNAME=boost_date_time
AC_MSG_CHECKING([for BOOST])
AC_TRY_COMPILE(
[
#include "boost/date_time/gregorian/greg_month.hpp"
],
[
boost::gregorian::bad_month* bm = new boost::gregorian::bad_month;
],
[
AC_MSG_RESULT(yes)
],
[
AC_MSG_ERROR([lib $LIBNAME not found.  Try: sudo apt-get install libboost-dev])
])

这就避免了使用未混合的符号。

我能理解他的动机-损坏的名称是否会在库中,如果没有,则是错误的。他实际上并没有试图调用一个被破坏的(或者在这个上下文中是不被破坏的)函数。添加一个自定义规则并不是一个坏主意。请注意,命令的
PHP\u CHECK\u库($LIBNAME,$LIBSYMBOL,,
etc)部分正是一个特定于PHP的宏,用于检查对象文件中的符号。当然,它只用于C符号。