2009-04-28 11 views
2

나는 C++로 작성된 PHP 모듈을 가지고있다. PHP 모듈은 설치되는 C++ 라이브러리 (Boost Date_Time)에 의존한다.PHP 확장 기능을 빌드 할 때 unmangled C++ 심볼을 어떻게 확인합니까?

다음과 같이

현재, 내 config.m4 파일 파일 I 라이브러리를 확인하고 있습니다 :

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 
    ]) 

지금이 내 현재의 환경에서 작동하지만, 내가 고통이 아마에 휴식 것 알고 있어요 다른 버전의 라이브러리 또는 컴파일러.

automake가 mangled가 아닌 C++ 심볼을 이해하려면 어떻게해야합니까?

편집 : 나는 엉망이 이름을 확인하는 것은 끔찍하지만, "나노 -C"에 의해 반환되는 심볼 이름을 확인하는 몇 가지 방법이 아니라는 것을 깨닫게

(예 : 부스트 : 그레고리 :: bad_month을 기타).

automake 명령 AC_LANG_CPLUSPLUS()에 대한 리펙스를 찾았지만 사용법 및 여기에 적용 할 수 있는지 여부는 확실하지 않습니다.

답변

2

당신은 그런 일에 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]) 
]) 

이 unmangled 기호의 사용을 피하십시오.

0

특정 C++ 컴파일러의 환경 외부에서 "맹 글링되지 않은 C++ 심볼"이 없습니다. 링커 및 사서와 같은 외부 도구에 고유 한 이름을 제공하기 위해 정밀하게 mangling이 수행됩니다.

0

호출 할 부스트 API 함수에 대한 C++ 래퍼 집합을 제공해야합니다. 이 래퍼는 같이 extern "C"로 선언해야합니다

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

귀하의 PHP 코드보다는 직접 C++ 메소드를 호출하는 것보다,이 래퍼를 사용해야합니다.

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

#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; 
} 

, 당신은 다음,이 컴파일 귀하의 필요와 pickiness에 따라

nm -C | grep "boost::gregorian::bad_month" 

을 통해 출력을 실행하려는 것, 당신은 더 찾을 수있는 grep 명령을 구체화 할 수 있습니다 문자열 "typeinfo for boost::gregorian::bad_month"(이는 특정 컴파일러 구현에 대한 의존성을 더욱 높여줍니다).

+1

질문을 다시 읽으십시오 - 그가 묻는 것이 아닙니다. –

0

개방 된 상태에서 맹 글링 된 기호를 사용하는 것은 끔찍한 생각입니다. 처음에 왜 이것을 필요로했을까요?

업데이트를 확인한 후에 사용자 지정 규칙을 사용하여 nm을 호출하고이 정보를 얻고이 규칙을 요구 사항으로 전달하도록하는 것이 좋습니다. autoconf이 심볼에 대한 오브젝트 파일을 검사하기위한 직접 명령을 제공한다면 매우 놀랄 것입니다.

+0

나는 그의 동기를 이해할 수있다 - 맹 글링 된 이름은 도서관에있을 것인가 아닌가, 그렇지 않다면 그것은 오류이다. 그는 실제로 이런 맥락에서 맹 글링 된 (또는 엉킴이없는) 기능을 호출하려고하지 않습니다. –

+0

맞춤 규칙을 추가하는 것은 좋지 않습니다. 이 명령의'PHP_CHECK_LIBRARY ($ LIBNAME, $ LIBSYMBOL ,,'etc 부분은 정확히 객체 파일에서 심볼을 검사하는 PHP의 특정 매크로이지만 C 심볼의 경우에만 해당합니다. –