문제

C ++로 작성된 PHP 모듈이 있는데, 이는 C ++ 라이브러리 (BOOST DATE_TIME)를 설치하는 데 의존합니다.

현재 내 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
  ])

이제 이것은 내 현재 환경에서 작동하지만, 이것이 다른 버전의 라이브러리 나 컴파일러에서 깨질 것이라는 것을 고통스럽게 알고 있습니다.

가해지지 않은 C ++ 기호를 이해하기 위해 Automake를 얻으려면 어떻게해야합니까?

편집하다:

나는 엉망진창 이름을 확인하는 것이 끔찍하다는 것을 알고 있지만 "nm -c"(예 : boost :: gregorian :: bad_month 등)에 의해 반환 된 기호 이름을 확인하는 방법은 없습니다.

Automake 명령 AC_LANG_CPLUSPLUS ()에 대한 반박을 찾았지만 사용 방법과 여기에 적용 가능한지 확실하지 않습니다.

도움이 되었습니까?

해결책

당신은 확인할 수 있습니다 AC_TRY_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])
])

이것은 감각이없는 상징의 사용을 피합니다.

다른 팁

특정 C ++ 컴파일러의 환경 외에는 "비 완화 된 C ++ 기호"가 없습니다. 링커 및 사서와 같은 외부 도구에 고유 한 이름을 제공하기 위해 Mangling이 정확하게 수행됩니다.

이것은 끔찍한 생각입니다. 왜 처음에 이것을 필요로 했습니까?

업데이트를 본 후, 나는 물어봐야 할 것입니다. 왜 사용자 지정 규칙을 사용하여 호출하지 마십시오. nm 그리고이 정보를 얻고이 규칙을 요구 사항으로 전달하도록합니까? 나는 매우 놀랄 것이다 autoconf 기호에 대한 객체 파일을 확인하는 직접 명령을 제공하는 것이 었습니다.

호출하려는 부스트 API 기능에 대한 C ++ 포장지 세트를 제공해야합니다. 이 포장지는 선언해야합니다 extern "C",에서와 같이 :

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

PHP 코드는 C ++ 메소드를 직접 호출하려고하지 않고 이러한 래퍼를 사용해야합니다.

편집하다: 당신은 가용성을 가정하고 있기 때문에 automake, 당신은 아마도 설치의 일부로 부스트 라이브러리를 컴파일 할 계획입니다. 이것은 당신에게 이름 Mangling의 결과를 조사 할 수있는 옵션을 제공합니다. 이 라인을 따라 테스트 C ++ 프로그램을 작성해보십시오. 이것은 컴파일하기 만하면됩니다; 유효한 결과를 생성 할 필요가 없습니다.

#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"(이것은 특정 컴파일러 구현에 대한 의존성을 더욱 증가 시킨다는 점에 유의하십시오.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top