Sto cercando di compilare un programma su Ubuntu 11.10 che utilizza le librerie Boost. Ho installato le librerie Boost 1.46-dev dal repository di Ubuntu, ma ricevo un errore durante la compilazione del programma.
undefined reference to boost::system::system_category()
Che cosa ho sbagliato?
La libreria boost in uso dipende dalla libreria boost_system. (Non tutti lo fanno.)
Supponendo di usare gcc, prova ad aggiungere -lboost_system
alla riga di comando del compilatore per collegarti a quella libreria.
Il collegamento con una libreria che definisce il simbolo mancante ( -lboost_system
) è la soluzione ovvia, ma nel caso particolare di Boost.System, una disfunzione nella progettazione originale fa sì che usi boost::system::generic_category()
e boost::system::system_category()
inutilmente. La compilazione con il flag -DBOOST_SYSTEM_NO_DEPRECATED
disabilita quel codice e consente la compilazione di un numero di programmi senza richiedere -lboost_system
(il collegamento è ovviamente ancora necessario se si utilizzano esplicitamente alcune funzionalità della libreria).
A partire da Boost 1.66 e questo commit , questo comportamento è ora il default, quindi si spera che sempre meno utenti abbiano bisogno di questa risposta.
Come notato da @AndrewMarshall, un’alternativa è definire BOOST_ERROR_CODE_HEADER_ONLY
che abilita una versione di solo header del codice. Tuttavia, questo è scoraggiato da Boost in quanto può rompere alcune funzionalità.
L’errore sopra riportato è un errore del linker … il linker è un programma che prende uno o più oggetti generati da un compilatore e li combina in un singolo programma eseguibile.
È necessario aggiungere “-l boost_system” ai flag del linker che indicano al linker che deve cercare simboli come boost::system::system_category()
nella libreria libboost_system.so
Se hai main.cpp, o:
g++ main.cpp -o main -lboost_system
O
g++ -c -o main.o main.cpp g++ main.o -lboost_system
Ho avuto lo stesso 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 :(. Testo + 0x54): riferimento indefinito a `boost :: system :: generic_category ()
La soluzione era usare la versione di debug della 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
Ma perché?
Quando usi CMAKE e find_package, assicurati che sia:
find_package(Boost COMPONENTS system ...)
e non
find_package(boost COMPONENTS system ...)
Alcune persone potrebbero aver perso ore per quello …
Un’altra soluzione per coloro che non hanno bisogno dell’intero shebang: usa l’interruttore
-DBOOST_ERROR_CODE_HEADER_ONLY
.
Se usi CMake, è add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
.
nel mio caso, l’aggiunta di -lboost_system
non era abbastanza, non riusciva ancora a trovarlo nel mio ambiente di build personalizzato. Ho dovuto usare il consiglio per sbarazzarsi di “gcc – / usr / bin / ld: avviso lib non trovato” e cambiare il mio comando ./configure
per:
./configure CXXFLAGS="-I$HOME/include" LDFLAGS="-L$HOME/lib -Wl,-rpath-link,$HOME/lib" --with-boost-libdir=$HOME/lib --prefix=$HOME
per maggiori dettagli vedi Boost 1.51: “errore: imansible collegarsi a boost_thread!”
Quando ho avuto questo problema, la causa è stata l’ordinamento delle librerie. Per risolvere il problema, ho inserito libboost_system
ultimo:
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
Questo era su mingw con gcc 5.3 e boost 1.61.0 con un semplice esempio di timer.
… e nel caso in cui volessi colbind il tuo main static, nel tuo Jamfile aggiungi quanto segue ai requisiti:
static /boost/system//boost_system
e forse anche:
-static-libgcc -static-libstdc++