c++ - nestle - referencia indefinida para boost:: system:: system_category() al compilar
install boost ubuntu (9)
... 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++
Estoy intentando compilar un programa en Ubuntu 11.10 que usa las bibliotecas de Boost. Tengo las bibliotecas 1.46-dev Boost del Depósito de Ubuntu instaladas, pero aparece un error al compilar el programa.
undefined reference to boost::system::system_category()
¿Qué es lo que hago mal?
Cuando tuve esto, problema, la causa fue el orden de las bibliotecas. Para solucionarlo, puse libboost_system
último:
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 estaba en mingw con gcc 5.3 y boost 1.61.0 con un simple ejemplo de temporizador.
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 ...
El enlace 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, una mala característica en el diseño original hace que use boost::system::generic_category()
y boost::system::system_category()
innecesariamente. La -DBOOST_SYSTEM_NO_DEPRECATED
con el indicador -DBOOST_SYSTEM_NO_DEPRECATED
deshabilita ese código y permite que un número de programas compile sin requerir -lboost_system
(ese enlace por supuesto sigue siendo necesario si usted explícitamente utiliza algunas de las características de la biblioteca).
A partir de Boost 1.66 y este compromiso , 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
que habilita una versión de solo cabecera del código. Sin embargo, Boost lo discouraged porque puede romper algunas funcionalidades.
El error anterior es un error del enlazador ... el enlazador es un programa que toma uno o más objetos generados por un compilador y los combina en un único programa ejecutable.
Debe agregar ''-l boost_system'' a los indicadores del vinculador que indica 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
La biblioteca de impulso que está utilizando depende de la biblioteca boost_system. (No todos lo hacen.)
Suponiendo que usa gcc, intente agregar -lboost_system
a la línea de comandos del compilador para enlazar con esa biblioteca.
Otra solución para aquellos que no necesitan todo el shebang: use el interruptor
-DBOOST_ERROR_CODE_HEADER_ONLY
.
Si usa CMake, es add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
.
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 :(. Text + 0x54): referencia no definida a `boost :: system :: generic_category ()
La solución fue usar la versión de depuración del sistema-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é?
en mi caso, agregar -lboost_system
no era suficiente, aún no podía encontrarlo en mi entorno de compilación personalizado. Tuve que usar el consejo en Deshacerse de "gcc - / usr / bin / ld: advertencia de lib no encontrada" y cambiar mi comando ./configure
a:
./configure CXXFLAGS="-I$HOME/include" LDFLAGS="-L$HOME/lib -Wl,-rpath-link,$HOME/lib" --with-boost-libdir=$HOME/lib --prefix=$HOME
para más detalles vea Boost 1.51: "error: ¡no se pudo vincular con boost_thread!"