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


105

Sto cercando di compilare un programma su Ubuntu 11.10 che utilizza le librerie Boost. Ho installato le librerie 1.46-dev Boost dal repository Ubuntu, ma ricevo un errore durante la compilazione del programma.

undefined reference to boost::system::system_category()

Cos'è che sbaglio?


6
Non è un errore del compilatore, è un errore del linker . Devi collegarti alla libreria Boost.System.
ildjarn

Risposte:


160

La libreria boost che stai utilizzando dipende dalla libreria boost_system. (Non tutti lo fanno.)

Supponendo che utilizzi gcc, prova ad aggiungere -lboost_systemalla riga di comando del compilatore per collegarti a quella libreria.


3
Sto usando un Makefile g ++ per la compilazione. Dove si mettono solitamente queste bandiere?
user1049697

2
Il modo in cui viene assemblata la riga di comando del compilatore / linker varia notevolmente da caso a caso. Perché non incolli il tuo Makefile (o le parti rilevanti di esso) nella tua domanda? In questo modo, potresti ottenere una risposta che funziona nel tuo caso specifico.
hc_

7
Ok, ho modificato Makefile.am e ha aggiunto -lboost_system, in modo che si presentava così: sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system. Non ha aiutato però ...
user1049697

1
Ancora lo stesso errore? Hai corso autoreconfdopo? Inoltre, questo post e questo potrebbero aiutarti con la configurazione degli autotools.
hc_

2
L'ho sostituito sslsniff_LDFLAGScon sslsniff_LDADDin Makefile.am e NON ha funzionato. Poi li ho tenuti entrambi sslsniff_LDFLAGSe ho aggiunto sslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp. Quindi sono stato in grado di compilare. Grazie per l'aiuto!
user1049697

62

Il collegamento con una libreria che definisce il simbolo mancante ( -lboost_system) è la soluzione più ovvia, ma nel caso particolare di Boost.System, una funzionalità errata nel design originale lo rende inutile boost::system::generic_category()e utilizzabile boost::system::system_category(). La compilazione con il flag -DBOOST_SYSTEM_NO_DEPRECATEDdisabilita quel codice e consente a un certo numero di programmi di compilarsi senza richiederlo -lboost_system(quel collegamento è ovviamente ancora necessario se si utilizzano esplicitamente alcune delle funzionalità della libreria).

A partire da Boost 1.66 e questo commit , questo comportamento è ora l'impostazione predefinita, quindi si spera che sempre meno utenti dovrebbero aver bisogno di questa risposta.

Come notato da @AndrewMarshall, un'alternativa è definire BOOST_ERROR_CODE_HEADER_ONLYquale abilita una versione di sola intestazione del codice. Questo è stato scoraggiato da Boost in quanto può interrompere alcune funzionalità. Tuttavia, a partire dalla 1.69, la sola intestazione sembra essere diventata l'impostazione predefinita , presumibilmente rendendo questa domanda obsoleta.


4
Grazie!!! nulla ha aiutato da quando uso boost 1.41 (Centos SL) l'unica cosa che mi ha liberato, è usare il -DBOOST_SYSTEM_NO_DEPRECATED
Roger Rabbit

5
In realtà quello che potresti volere è -DBOOST_ERROR_CODE_HEADER_ONLY
Andrew Marshall

1
È interessante notare che il nuovo comportamento Boost 1.66 di avere meno riferimenti a system_category () ecc. Può introdurre nuovi problemi di collegamento in presenza di problemi di ordinamento dei collegamenti. Vedi github.com/PointCloudLibrary/pcl/pull/2236 per esempio
pixelbeat

3
Se si usa CMake basta aggiungere 'add_definitions (-DBOOST_ERROR_CODE_HEADER_ONLY)'
Nickolay

1
L'unico fix che ha funzionato per me con Boost 1.68 era definire BOOST_ERROR_CODE_HEADER_ONLY.
sakra

17

Un'altra soluzione alternativa per coloro che non hanno bisogno dell'intera faccenda: usa l'interruttore

-DBOOST_ERROR_CODE_HEADER_ONLY.

Se usi CMake, è add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY).


1
Di recente ho riscontrato questo problema. Niente funziona tranne questo. Mi chiedo se questo sia ancora scoraggiato dalla spinta come menzionato nella risposta di Marc Glisse.
John Z. Li

1
quote "Boost.System ora è solo di intestazione. Una libreria stub è ancora costruita per compatibilità, ma il collegamento ad essa non è più necessario."
John Z. Li

16

L'errore precedente è un errore del linker ... il linker è un programma che prende uno o più oggetti generati da un compilatore e li combina in un unico programma eseguibile.

Devi aggiungere i -lboost_systemflag del linker che indicano al linker che deve cercare i simboli come boost::system::system_category()nella libreria libboost_system.so.

Se hai main.cpp, puoi:

g++ main.cpp -o main -lboost_system

O

g++ -c -o main.o main.cpp
g++ main.o -lboost_system

5
lo spazio tra -l e il nome della libreria non è corretto. dovresti usare -lboost_system
portforwardpodcast

1
Ho scoperto che ai centesimi non importava la posizione di -l ma Ubuntu sì, deve essere alla fine.
chiesto_io il

7

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


6

Ho 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 :(. Text + 0x54): riferimento non definito a `boost :: system :: generic_category ()

La soluzione era utilizzare la versione di debug della lib di sistema:

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é?


1
Può essere che da qualche parte è stato definito un flag di debug, quindi avevi altre librerie compilate in debug o g ++ stava producendo debug obj?
noonex

4

Quando ho avuto questo problema, la causa era l'ordinamento delle biblioteche. Per aggiustarlo, metto per libboost_systemultimo:

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.


1
Questo era anche il mio problema. L'ho incluso tramite CMake e, per qualsiasi motivo, le dipendenze e l'ordinamento presunti sono stati elaborati nello script FindBoost. In realtà, però, il mio problema è stato sempre utilizzare librerie condivise e non prestare mai attenzione, quindi passare a librerie statiche e ottenere errori di compilazione. Ops.
Anthony

Questo ha risolto anche per me ... prima di questa soluzione l'unica cosa che funzionava era definire BOOST_ERROR_CODE_HEADER_ONLY. Su Ubuntu 18.04, boost 1.68, con cmake. La mia correzione: target_link_libraries (eseguibile pthread ssl crypto boost_system)
Luis

2

nel mio caso, l'aggiunta -lboost_systemnon era sufficiente, non riuscivo ancora a trovarlo nel mio ambiente di compilazione personalizzato. Ho dovuto usare il consiglio su Elimina "gcc - / usr / bin / ld: warning lib not found" e cambiare il mio ./configurecomando in:

./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: impossibile collegarsi a boost_thread!"


1

... e nel caso in cui volessi collegare il tuo main staticamente, nel tuo Jamfile aggiungi quanto segue ai requisiti:

<link>static
<library>/boost/system//boost_system

e forse anche:

<linkflags>-static-libgcc
<linkflags>-static-libstdc++
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.