2012-02-14 27 views
6

Estoy tratando de compilar/portar una versión anterior de OpenOffice. Utiliza Boost v1.34.1, que es parte del árbol fuente. El mensaje de error es como sigue:Símbolo de refuerzo no encontrado

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 es nuevo para mí, y no he podido encontrar mucho en línea para ayudar a entender esto. Del mensaje de error, entiendo que probablemente necesite vincular una biblioteca. Sin embargo, boost::throw_exception se define en un archivo de encabezado sin biblioteca coincidente (que puedo encontrar). Solo por patear, probé #include <boost/throw_exception.hpp> en detfunc y usé enlaces simbólicos para poner el archivo de encabezado en el mismo directorio sin suerte.

¿Hay una biblioteca que deba vincular con -l o una ruta de acceso incluida con -I? ¿Cómo debería obtener ese símbolo al que se hace referencia?

Respuesta

12

Boost espera que el proyecto se construya con macro BOOST_NO_EXCEPTIONS indefinido, o para definir la función boost::throw_exception.

De <boost/throw_exception.hpp> en la versión 1.34.1: cabeceras de configuración

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 

de Boost determinarán si para definir la macro o no. Parece que se reduce al compilador que está utilizando, pero puede haber otros factores. Eche un vistazo en la carpeta boost/config/compiler/ para el archivo de encabezado que corresponde a su compilador, luego busque BOOST_NO_EXCEPTIONS en él. Debería haber algunas condiciones alrededor del #define para ayudar a explicar cuándo Boost lo define. Es posible que pueda configurar su compilación para evitar la definición y superar el error del enlazador que está experimentando.

Si no puede cambiar la configuración del compilador para evitar la definición, probablemente esté definiendo boost::throw_exception(std::exception const & e) en algún lugar del código de OpenOffice. No estoy familiarizado con ese código, así que no puedo dar una buena sugerencia sobre dónde debería ir.

+0

Gracias! Eventualmente había leído 'throw_exception.hpp' y ya descubrí exactamente qué respondiste. No conocía 'boost/config/compiler /' para los indicadores del compilador, pero sí se definió 'BOOST_NO_EXCEPTIONS'. – Jerry

Cuestiones relacionadas