riferimento non definito a boost :: system :: system_category () durante la compilazione

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