2012-02-14 11 views
6

Sto provando a compilare/eseguire il porting di una versione precedente di OpenOffice. Utilizza Boost v1.34.1, che fa parte dell'albero dei sorgenti. Il messaggio di errore è la seguente:Simbolo di potenziamento non trovato

Undefined symbols: 
    "boost::throw_exception(std::exception const&)", referenced from: 
     boost::detail::shared_count::shared_count<ScToken>(ScToken*)in detfunc.o 
ld: symbol(s) not found 

Boost è nuovo per me, e io non sono riuscito a trovare molto in linea di aiutarmi a capire questo. Dal messaggio di errore, capisco che probabilmente ho bisogno di collegare una libreria. Tuttavia, boost::throw_exception è definito in un file di intestazione senza libreria corrispondente (che posso trovare). Solo per i calci, ho provato #include <boost/throw_exception.hpp> in detfunc e usando i collegamenti simbolici per mettere il file di intestazione nella stessa directory senza fortuna.

C'è una libreria che dovrei collegare con -l o un percorso di inclusione con -I? Come dovrei ottenere il riferimento a quel simbolo?

risposta

12

Boost si aspetta che il progetto sia creato con la macro BOOST_NO_EXCEPTIONS indefinita o per definire la funzione boost::throw_exception stessa.

Da <boost/throw_exception.hpp> nella versione 1.34.1: intestazioni di configurazione

namespace boost 
{ 

#ifdef BOOST_NO_EXCEPTIONS 

void throw_exception(std::exception const & e); // user defined 

#else 

//[Not user defined --Dynguss] 
template<class E> inline void throw_exception(E const & e) 
{ 
    throw e; 
} 

#endif 

} // namespace boost 

di Boost determineranno se definire la macro o meno. Sembra che si riduca al compilatore che stai utilizzando, ma potrebbero esserci altri fattori. Dai uno sguardo alla cartella boost/config/compiler/ per il file di intestazione che corrisponde al tuo compilatore, quindi cerca BOOST_NO_EXCEPTIONS in esso. Ci dovrebbero essere alcune condizioni attorno allo #define per aiutare a spiegare quando Boost lo definisce. Potresti essere in grado di configurare la build per evitare la definizione e superare l'errore del linker che stai riscontrando.

Se non si riesce a modificare la configurazione del compilatore per evitare la definizione, probabilmente si rimarrà da soli la definizione di boost::throw_exception(std::exception const & e) nel codice di OpenOffice. Non ho familiarità con quel codice, però, quindi non posso dare un buon suggerimento su dove dovrebbe andare.

+0

Grazie! Alla fine ho letto "throw_exception.hpp" e ho già scoperto esattamente cosa hai risposto. Non ero a conoscenza di 'boost/config/compiler /' per i flag del compilatore, ma abbastanza sicuro, 'BOOST_NO_EXCEPTIONS' è stato definito. – Jerry