Estoy intentando comstackr un progtwig 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 comstackr el progtwig.
undefined reference to boost::system::system_category()
¿Qué es lo que hago mal?
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 comstackdor para enlazar con esa biblioteca.
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 progtwigs 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 desalienta porque puede romper algunas funcionalidades.
El error anterior es un error del enlazador … el enlazador es un progtwig que toma uno o más objetos generados por un comstackdor y los combina en un único progtwig 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
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é?
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 …
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)
.
en mi caso, agregar -lboost_system
no era suficiente, aún no podía encontrarlo en mi entorno de comstackció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!”
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.
… y en caso de que desee vincular su principal estáticamente, en su Jamfile agregue lo siguiente a los requisitos:
static /boost/system//boost_system
y quizás también:
-static-libgcc -static-libstdc++