Estoy tratando de compilar un programa en Ubuntu 11.10 que use las bibliotecas Boost. Tengo instaladas las bibliotecas 1.46-dev Boost del repositorio de Ubuntu, pero aparece un error al compilar el programa.
undefined reference to boost::system::system_category()
¿Qué es lo que hago mal?
Respuestas:
La biblioteca boost que está utilizando depende de la biblioteca boost_system. (No todos lo hacen.)
Suponiendo que usa gcc, intente agregarlo
-lboost_system
a la línea de comando del compilador para vincularlo con esa biblioteca.fuente
-lboost_system
, por lo que se veía así:sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system
. Sin embargo, no ayudó ...autoreconf
después? Además, esta publicación y esta pueden ayudarlo con la configuración de su autotools.sslsniff_LDFLAGS
consslsniff_LDADD
en Makefile.am y eso NO funcionó. Luego guardé ambossslsniff_LDFLAGS
y agreguésslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp
. Entonces pude compilar. ¡Gracias por la ayuda!La vinculación con una biblioteca que define el símbolo que falta (
-lboost_system
) es la solución obvia, pero en el caso particular de Boost.System, un misfeature en el diseño original hace que utilizarboost::system::generic_category()
yboost::system::system_category()
innecesariamente. La compilación con el indicador-DBOOST_SYSTEM_NO_DEPRECATED
deshabilita ese código y permite que varios programas se compilen sin necesidad-lboost_system
(ese enlace, por supuesto, aún es necesario si usa explícitamente algunas de las características de la biblioteca).A partir de Boost 1.66 y esta confirmación , este comportamiento ahora es el predeterminado, por lo que es de esperar que cada vez menos usuarios necesiten esta respuesta.
Como notó @AndrewMarshall, una alternativa es definir
BOOST_ERROR_CODE_HEADER_ONLY
cuál habilita una versión del código de solo encabezado. Esto fue desaconsejado por Boost ya que puede romper algunas funciones. Sin embargo, desde 1.69, el encabezado solo parece haberse convertido en el predeterminado , lo que supuestamente hace que esta pregunta sea obsoleta.fuente
BOOST_ERROR_CODE_HEADER_ONLY
.Otra solución para aquellos que no necesitan todo el asunto: use el interruptor
-DBOOST_ERROR_CODE_HEADER_ONLY
.Si usa CMake, es
add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
.fuente
El error anterior es un error del vinculador ... el vinculador es un programa que toma uno o más objetos generados por un compilador y los combina en un solo programa ejecutable.
Debe agregarle
-lboost_system
banderas del vinculador que le indiquen al vinculador que debe buscar símbolos comoboost::system::system_category()
en la bibliotecalibboost_system.so
.Si tiene main.cpp, ya sea:
O
fuente
Cuando use CMAKE y find_package, asegúrese de que sea:
y no
Algunas personas pueden haber perdido horas por eso ...
fuente
Tengo el mismo problema:
La solución fue usar la versión de depuración de system-lib:
¿Pero por qué?
fuente
Cuando tuve este problema, la causa fue el pedido de las bibliotecas. Para arreglarlo, pongo al
libboost_system
final:Esto fue en mingw con gcc 5.3 y boost 1.61.0 con un ejemplo de temporizador simple.
fuente
en mi caso, agregar
-lboost_system
no fue suficiente, todavía no pude encontrarlo en mi entorno de compilación personalizado. Tuve que usar el consejo en Deshacerse de "gcc - / usr / bin / ld: warning lib not found" y cambiar mi./configure
comando a:para obtener más detalles, consulte Boost 1.51: "error: ¡no se pudo vincular con boost_thread!"
fuente
... y en caso de que desee vincular su principal estáticamente, en su Jamfile agregue lo siguiente a los requisitos:
y quizás también:
fuente