Domanda

Ho un modulo PHP scritto in C ++, che si basa su una libreria C ++ (Boost Date_Time) in fase di installazione.

Al momento, nel mio file config.m4 Sto controllando per la libreria come segue:

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

Ora, questo funziona nel mio ambiente attuale, ma io sono dolorosamente consapevoli questo sarà probabilmente rompere su una versione diversa della libreria o compilatore.

Come posso ottenere automake per capire la non-straziati C ++ simbolo?

Modifica:

Mi rendo conto che il controllo sul nome storpiato è orribile, ma non c'è forse un modo di controllo per il nome del simbolo restituita dalla "nm -C" (ad esempio boost :: :: gregoriano bad_month ecc).

Ho trovato un po 'refence al comando automake AC_LANG_CPLUSPLUS (), ma non sono sicuro di come usarlo e se è applicabile qui.

È stato utile?

Soluzione

È possibile controllare AC_TRY_COMPILE con qualcosa di simile:

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

Questa evitare l'uso di simboli unmangled.

Altri suggerimenti

Al di fuori del contesto di un particolare compilatore C ++, non c'è "non straziati C ++ simbolo" -. La mutilazione viene eseguita proprio per fornire un nome univoco a strumenti esterni, come linkers e bibliotecari

Questa è una pessima idea - di avere simboli straziati alla luce del sole. Perché avete bisogno di questo, in primo luogo?

Dopo aver visto l'aggiornamento, avrei dovuto chiedere, perché non usare una regola personalizzata per invocare nm e ottenere queste informazioni e rendere questa regola per essere passato come un requisito? Sarei molto sorpreso se autoconf era quello di fornire un comando diretto per controllare i file oggetto per i simboli.

È necessario fornire una serie di C ++ wrapper per le funzioni API Boost che si desidera richiamare. Questi involucri devono essere dichiarate con extern "C", come in:

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

Il codice PHP dovrebbe utilizzare questi involucri, piuttosto che cercare di chiamare direttamente i metodi C ++.

Modifica : Dal momento che si sta assumendo la disponibilità di automake, probabilmente stai pensando di compilare la libreria Boost come parte dell'installazione. Questo vi dà la possibilità di sondare il risultato del nome storpiatura. Prova a creare un programma di test C ++ in questo senso. Si noti che questo ha solo bisogno di compilare ; non ha bisogno di produrre un risultato valido.

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

Nel vostro automake, che ci si vuole compilare questo, quindi eseguire l'output attraverso

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

A seconda delle esigenze e pickiness, si potrebbe desiderare di affinare ulteriormente il comando grep per cercare la stringa "typeinfo for boost::gregorian::bad_month" (si noti che questo aumenta ulteriormente la vostra dipendenza dalla specifica implementazione del compilatore.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top