referencia indefinida a boost :: system :: system_category () al compilar

105

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?

usuario1049697
fuente
6
Eso no es un error del compilador, es un error del enlazador . Debe vincularse a la biblioteca Boost.System.
ildjarn

Respuestas:

160

La biblioteca boost que está utilizando depende de la biblioteca boost_system. (No todos lo hacen.)

Suponiendo que usa gcc, intente agregarlo -lboost_systema la línea de comando del compilador para vincularlo con esa biblioteca.

hc_
fuente
3
Estoy usando un Makefile g ++ para la compilación. ¿Dónde se suelen poner esas banderas?
user1049697
2
La forma en que se ensambla la línea de comandos del compilador / enlazador varía mucho de un caso a otro. ¿Por qué no pega su Makefile (o las partes relevantes del mismo) en su pregunta? De esa manera, podría obtener una respuesta que funcione en su caso específico.
hc_
7
Ok, he editado Makefile.am y añadió -lboost_system, por lo que se veía así: sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system. Sin embargo, no ayudó ...
user1049697
1
¿Sigue siendo el mismo error? ¿Corriste autoreconfdespués? Además, esta publicación y esta pueden ayudarlo con la configuración de su autotools.
hc_
2
Reemplacé sslsniff_LDFLAGScon sslsniff_LDADDen Makefile.am y eso NO funcionó. Luego guardé ambos sslsniff_LDFLAGSy agregué sslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp. Entonces pude compilar. ¡Gracias por la ayuda!
user1049697
62

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 utilizar boost::system::generic_category()y boost::system::system_category()innecesariamente. La compilación con el indicador -DBOOST_SYSTEM_NO_DEPRECATEDdeshabilita 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_ONLYcuá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.

Marc Glisse
fuente
4
¡¡¡Gracias!!! nada ayudó ya que uso boost 1.41 (Centos SL), lo único que me liberó, es usar el -DBOOST_SYSTEM_NO_DEPRECATED
Roger Rabbit
5
En realidad, lo que puede querer es -DBOOST_ERROR_CODE_HEADER_ONLY
Andrew Marshall
1
Curiosamente, el nuevo comportamiento de Boost 1.66 de tener menos referencias a system_category (), etc. puede introducir nuevos problemas de enlaces en presencia de problemas de orden de enlaces. Ver github.com/PointCloudLibrary/pcl/pull/2236 por ejemplo
pixelbeat
3
Si usa CMake, simplemente agregue 'add_definitions (-DBOOST_ERROR_CODE_HEADER_ONLY)'
nickolay
1
El único arreglo que funcionó para mí con Boost 1.68 fue definir BOOST_ERROR_CODE_HEADER_ONLY.
sakra
17

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

Vadim Berman
fuente
1
Recientemente me encontré con este problema. Nada funciona excepto este. Me pregunto si esto todavía se desanima con el impulso como se menciona en la respuesta de Marc Glisse.
John Z. Li
1
quote "Boost.System ahora es solo de encabezado. Aún se crea una biblioteca de códigos auxiliares para la compatibilidad, pero ya no es necesario vincularla".
John Z. Li
16

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_systembanderas del vinculador que le indiquen al vinculador que debe buscar símbolos como boost::system::system_category()en la biblioteca libboost_system.so.

Si tiene main.cpp, ya sea:

g++ main.cpp -o main -lboost_system

O

g++ -c -o main.o main.cpp
g++ main.o -lboost_system
usuario1055604
fuente
5
el espacio entre -l y el nombre de la biblioteca es incorrecto. debe usar -lboost_system
portforwardpodcast
1
Descubrí que a centos no le importaba la posición de -l pero ubuntu sí, tiene que estar al final.
ask_io
7

Cuando use CMAKE y find_package, asegúrese de que sea:

find_package(Boost COMPONENTS system ...)

y no

find_package(boost COMPONENTS system ...)

Algunas personas pueden haber perdido horas por eso ...

Kriegalex
fuente
6

Tengo el mismo problema:

g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib  -LD:/bfs_ENTW_deb/lib   -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib   \
 D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \
 -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-1_47 -lboost_filesystem-mgw45-mt-1_47

D: /bfs_ENTW_deb/obj/test/main_filesystem.obj: main_filesystem.cpp :(. Texto + 0x54): referencia no definida a `boost :: system :: generic_category ()

La solución fue usar la versión de depuración de system-lib:

g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib  -LD:/bfs_ENTW_deb/lib   -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib   \
 D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \
 -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-d-1_47 -lboost_filesystem-mgw45-mt-1_47

¿Pero por qué?

volker
fuente
1
¿Puede ser que en algún lugar se definió algún indicador de depuración, por lo que tenía otras bibliotecas integradas en debug o g ++ estaba produciendo debug obj?
noonex
4

Cuando tuve este problema, la causa fue el pedido de las bibliotecas. Para arreglarlo, pongo al libboost_systemfinal:

g++ mingw/timer1.o -o mingw/timer1.exe  -L/usr/local/boost_1_61_0/stage/lib \
    -lboost_timer-mgw53-mt-1_61 \
    -lboost_chrono-mgw53-mt-1_61 \
    -lboost_system-mgw53-mt-1_61

Esto fue en mingw con gcc 5.3 y boost 1.61.0 con un ejemplo de temporizador simple.

Min Zhang
fuente
1
Este también era mi problema. Lo incluí a través de CMake y, por alguna razón, las dependencias asumidas y el orden se resolvieron en el script FindBoost. Realmente, sin embargo, mi problema siempre fue usar bibliotecas compartidas y nunca prestar atención, luego pasar a bibliotecas estáticas y obtener errores de compilación. ¡Ups!
Anthony
Esto también lo solucionó para mí ... antes de esta solución, lo único que funcionó fue definir BOOST_ERROR_CODE_HEADER_ONLY. En Ubuntu 18.04, aumente 1.68, con cmake. Mi solución: target_link_libraries (ejecutable pthread ssl crypto boost_system)
Luis
2

en mi caso, agregar -lboost_systemno 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 ./configurecomando a:

./configure CXXFLAGS="-I$HOME/include" LDFLAGS="-L$HOME/lib -Wl,-rpath-link,$HOME/lib" --with-boost-libdir=$HOME/lib --prefix=$HOME

para obtener más detalles, consulte Boost 1.51: "error: ¡no se pudo vincular con boost_thread!"

jcomeau_ictx
fuente
1

... y en caso de que desee vincular su principal estáticamente, en su Jamfile agregue lo siguiente a los requisitos:

<link>static
<library>/boost/system//boost_system

y quizás también:

<linkflags>-static-libgcc
<linkflags>-static-libstdc++
formiaczek
fuente