referencia indefinida para boost :: system :: system_category () al comstackr

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++