2009-04-28 4 views
2

У меня есть PHP-модуль, написанный на C++, который опирается на установленную C++-библиотеку (Boost Date_Time).Как я могу проверить unmangled символ C++ при создании расширения PHP?

В настоящее время, в моем файле 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 
    ]) 

Теперь, это работает в моей текущей ситуации, но я болезненно осознает это, вероятно, перерыв на другой версии библиотеки или компилятора.

Как я могу получить automake, чтобы понять неповрежденный символ C++?

Edit:

Я понимаю, что проверка на искаженное имя попало, но не какой-то способ проверки имени символа в качестве возвращаемого «нм -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++» - манипуляция выполняется именно для предоставления уникального имени внешним инструментам, таким как компоновщики и библиотекари.

0

Вам необходимо предоставить набор оберток C++ для функций расширения apost, которые вы хотите вызвать. Эти обертки должны быть объявлены с extern "C", как:

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

Ваш PHP-код должен использовать эти фантики, а не пытаться напрямую вызывать методы C++.

EDIT: Поскольку вы предполагаете наличие automake, вы, вероятно, планируете скомпилировать библиотеку Boost как часть установки. Это дает вам возможность исследовать результат смены имени. Попробуйте создать тестовую программу на 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» (обратите внимание, что это еще больше увеличивает зависимость от конкретной реализации компилятора.)

+1

Перечитайте вопрос - это не то, о чем он спрашивает. – 2009-04-28 15:47:09

0

Это ужасная идея - вырвать искаженные символы на открытом воздухе. Зачем вам это нужно в первую очередь?

Увидев ваше обновление, я должен был спросить, почему бы не использовать настраиваемое правило для вызова nm и получить эту информацию и принять это правило в качестве требования? Я был бы очень удивлен, если бы autoconf должен был предоставить прямую команду для проверки файлов объектов для символов.

+0

Я могу понять его мотивацию - искаженное имя будет в библиотеке или нет, если нет, то это ошибка. Он на самом деле не пытается назвать искаженную (или невзаимодействующую в этом контексте) функцию. – 2009-04-28 15:37:44

+0

Добавление настраиваемого правила - неплохая идея. Заметим, что команда 'PHP_CHECK_LIBRARY ($ LIBNAME, $ LIBSYMBOL ,,' и т. Д. Команды именно это - специфичный для PHP макрос для проверки объектных файлов для символов. Но для символов C, конечно, конечно. –

 Смежные вопросы

  • Нет связанных вопросов^_^