2012-03-15 1 views
79

Sto provando a 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.riferimento indefinito a boost :: system :: system_category() durante la compilazione

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

Che cosa è che ho sbagliato?

+5

Questo non è un errore del compilatore, è un errore _linker_. Devi collegarti alla libreria Boost.System. – ildjarn

risposta

138

La libreria boost in uso dipende dalla libreria boost_system. (Non lo fanno tutti.)

Supponendo di utilizzare gcc, provare ad aggiungere -lboost_system alla riga di comando del compilatore per collegarsi a tale libreria.

+0

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

+1

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 relative parti) nella tua domanda? In questo modo, potresti ottenere una risposta che funzioni nel tuo caso specifico. –

+0

Ecco il Makefile: http://pastebin.com/TgkW4V2b – user1049697

13

L'errore di cui sopra è un errore di linker ... il linker a program that takes one or more objects generated by a compiler and combines them into a single executable program.

è necessario aggiungere 'boost_system -l' a voi linker flag che indica al linker che deve cercare i simboli come boost::system::system_category() nella biblioteca libboost_system.so

Se avete main.cpp, sia:

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 il nome della libreria non è corretto. dovresti usare -lboost_system – portforwardpodcast

+0

Ho scoperto che ai centos non importava la posizione di -l ma Ubuntu, alla fine doveva essere. –

1

... e nel caso in cui si volesse collegare il tuo principale staticamente, nel vostro Jamfile aggiungere il seguente alle esigenze:

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

e forse anche:

<linkflags>-static-libgcc 
<linkflags>-static-libstdc++ 
6

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) : undefined reference to `boost :: :: sistema generic_category()

soluzione era quella di utilizzare il debug-versione 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 

Ma perché?

+1

Può essere che da qualche parte sia stato definito un flag di debug, quindi hai avuto altre librerie compilate in debug o g ++ stava producendo debug obj? – noonex

2

nel mio caso, l'aggiunta di -lboost_system non è stata sufficiente, non è riuscita a trovarla nel mio ambiente di compilazione personalizzato. Ho dovuto usare il consiglio a Get rid of "gcc - /usr/bin/ld: warning lib not found" e cambiare il mio comando ./configure a:

./configure CXXFLAGS="-I$HOME/include" LDFLAGS="-L$HOME/lib -Wl,-rpath-link,$HOME/lib" --with-boost-libdir=$HOME/lib --prefix=$HOME 

per maggiori dettagli vedere Boost 1.51 : "error: could not link against boost_thread !"

36

collegamento con una libreria che definisce il simbolo mancante (-lboost_system) è la soluzione più ovvia, ma in Nel caso particolare di Boost.System, una disfunzione nel design originale lo rende inutilizzabile con boost::system::generic_category() e boost::system::system_category(). La compilazione con il flag -DBOOST_SYSTEM_NO_DEPRECATED disabilita tale codice e consente di compilare 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 this commit, questo comportamento è ora l'impostazione predefinita, 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 codice di intestazione. Tuttavia, questo è discouraged da Boost in quanto può rompere alcune funzionalità.

+3

grazie !!! nulla è servito da quando uso boost 1.41 (Centos SL), l'unica cosa che mi ha liberato, sta usando il -DBOOST_SYSTEM_NO_DEPRECATED –

+1

Questa dovrebbe essere la risposta accettata IMO. – einpoklum

+2

In realtà ciò che si potrebbe desiderare è -DBOOST_ERROR_CODE_HEADER_ONLY –

3

Quando si utilizza CMAKE e find_package, assicurarsi che è:

find_package(Boost COMPONENTS system ...) 

e non

find_package(boost COMPONENTS system ...) 

Alcune persone potrebbero aver perso ore per quello ...

0

Quando ho avuto questo , problema, la causa era l'ordine delle biblioteche. Per risolvere il problema, ho messo libboost_system ultima:

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 mingw con gcc 5.3 e aumentare 1.61.0 con un semplice esempio timer.