2009-08-20 7 views
5

Sto imparando Boost e sto avendo problemi con i miei file make. Ecco il mio makefile di base:Comprese le librerie boost nei file make

accesstimer: acctime.o btimer.o 
    g++ acctime.o btimer.o -o accesstimer 

acctime.o: acctime.cpp btimer.h 
    g++ -c acctime.cpp 

bentimer.o: btimer.cpp btimer.h 
    g++ -c btimer.cpp 

Quando acctime.cpp non ha elementi spinta filesystem in essa questo m, file di Ake funziona bene. Non appena aggiungo elementi boost del filesystem, ovviamente ho bisogno di fare dei riferimenti alla libray boost nel file make. Questo è dove sto avendo problemi.

La riga seguente funziona per un singolo file di compilation:

g++ -I /usr/local/boost/boost_1_39_0 boosttest1.cpp -o bt1 /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a 

ora sto cercando di integrare questo nel file make. Ho provato molti basati su quali informazioni si possono trovare sul web, ma nessuno stiamo lavorando questo è il mio ultimo:

accesstimer: acctime.o bentimer.o 
    g++ acctime.o bentimer.o -o accesstimer 

acctime.o: acctime.cpp bentimer.h 
    g++ -c -I /usr/local/boost/boost_1_39_0 acctime.cpp /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a 

bentimer.o: bentimer.cpp bentimer.h 
    g++ -c bentimer.cpp 

Purtroppo stlill non può trovare le librerie Boost, chiunque può aiutare? grazie

Dopo aver letto il parere di persone che hanno risposto ora ho questo:

accesstimer: acctime.o bentimer.o 
    g++ -L /usr/local/boost/boost_1_39_0 acctime.o /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a bentimer.o -o accesstimer 

acctime.o: acctime.cpp bentimer.h 
    g++ -c acctime.cpp 

bentimer.o: bentimer.cpp bentimer.h 
    g++ -c bentimer.cpp 

Ma questo non riesce ancora a collegarsi.

Questo è il messaggio di errore sto ottenendo: (! Grazie molto apprezzato)

g++ -L /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a acctime.o bentimer.o -o accesstimer 
acctime.o: In function boost::enable_if<boost::filesystem::is_basic_path<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >, bool>::type boost::filesystem::exists<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >(boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> const&)': 
acctime.cpp:(.text._ZN5boost10filesystem6existsINS0_10basic_pathISsNS0_11path_traitsEEEEENS_9enable_ifINS0_13is_basic_pathIT_EEbE4typeERKS7_[boost::enable_if<boost::filesystem::is_basic_path<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >, bool>::type boost::filesystem::exists<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >(boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> const&)]+0x26): undefined reference to `boost::filesystem::detail::status_api(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int&)' 
collect2: ld returned 1 exit status 
make: *** [accesstimer] Error 1 

consiglio seguito di orsogufo ora avere questo:

accesstimer: acctime.o bentimer.o 
    g++ -L/usr/local/boost/boost_1_39_0/stage/lib -llibboost_filesystem-gcc41-mt.a -llibboost_system-gcc41-mt.a acctime.o bentimer.o -o accesstimer 

acctime.o: acctime.cpp bentimer.h 
    g++ -c acctime.cpp 

bentimer.o: bentimer.cpp bentimer.h 
    g++ -c bentimer.cpp 

Guardando meglio, ma ancora non riesco a trova la biblioteca:

g++ -L/usr/local/boost/boost_1_39_0/stage/lib -llibboost_filesystem-gcc41-mt.a -llibboost_system-gcc41-mt.a acctime.o bentimer.o -o accesstimer 
/usr/bin/ld: cannot find -llibboost_filesystem-gcc41-mt.a 
collect2: ld returned 1 exit status 
make: *** [accesstimer] Error 1 

Ho ricontrollato che la posizione e la libreria è sicuramente a: /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a

ancora nessuna gioia, usimg adesso:

accesstimer: acctime.o bentimer.o 
    g++ -L/usr/local/boost/boost_1_39_0 -lboost_filesystem-gcc41-mt acctime.o bentimer.o -o accesstimer  

acctime.o: acctime.cpp bentimer.h 
    g++ -I /usr/local/boost/boost_1_39_0 -c acctime.cpp 

bentimer.o: bentimer.cpp bentimer.h 
    g++ -c bentimer.cpp 

Ottenere:

g++ -L/usr/local/boost/boost_1_39_0/stage/lib/ -llibboost_filesystem-gcc41-mt acctime.o bentimer.o -o accesstimer 
/usr/bin/ld: cannot find -llibboost_filesystem-gcc41-mt 
collect2: ld returned 1 exit status 
make: *** [accesstimer] Error 1 

E ' lavorare con questo:

accesstimer: acctime.o bentimer.o 
    g++ -L/usr/local/boost/boost_1_39_0/stage/lib -lboost_filesystem acctime.o bentimer.o -o accesstimer  

acctime.o: acctime.cpp bentimer.h 
    g++ -I /usr/local/boost/boost_1_39_0 -c acctime.cpp 

bentimer.o: bentimer.cpp bentimer.h 
    g++ -c bentimer.cpp 

Grazie per tutto il vostro aiuto

01.235.164,106174 millions
+0

La prego di inviare il messaggio di errore che stai ricevendo? –

+0

Quando si collegano le librerie con il flag -l, si lascia sempre la "lib" iniziale. Quindi il collegamento di libm.a è -lm, libboost è -lboost, ecc. –

risposta

9

CURA
Quando si collega i file oggetto per creare l'eseguibile (la prima regola di makefile) è necessario passare il percorso delle librerie Boost con la bandierina -Lei nomi delle librerie con il flag -l .

accesstimer: acctime.o bentimer.o 
    g++ -L/usr/local/boost/boost_1_39_0/stage/lib -lboost_filesystem acctime.o bentimer.o -o accesstimer 

dove /usr/local/boost/boost_1_39_0/stage/lib è la directory contenente le librerie e boost_filesystem il nome del file della libreria senza l'inizio lib (modificare quei due a seconda dei casi).

ALTRO EDIT Il file .a si sta cercando di collegamento è quella sbagliata ... la biblioteca dovrebbe avere alcuna estensione.

2

È necessario aggiungere le librerie di boost alla fase di collegamento (la linea di destinazione del timer di accesso) e non alla fase di compilazione (dove è necessario solo il percorso di inclusione).

0

Ciao seguito è la procedura completa per aggiungere boost a cmake/make file. Questa risposta è stata sviluppata appositamente per i programmatori alle prime armi in cpp.

Se si desidera aggiungere il supporto della libreria boost con l'aiuto di Makefile, è necessario specificare il percorso della libreria (con l'opzione -L) e le librerie (con l'opzione -l).

-L path/to/i/librerie -l llibrary

** Ora come trovare il percorso per le librerie **

seguito è il trucco:

  1. Terminale aperto e comando incendio

    $ individuare spinta> libboost.txt

    $ gedit libboost.txt

  2. Questo comando apre un file di testo che contiene tutti i percorsi libreria Boost.

  3. ora trovare ("ctr + F") libboost, che mette in evidenza i file di libreria di spinta con estensione .so .a e in questo file di testo.

  4. Copia il percorso in cui sono presenti i file .so.

    esempio: se il file .so presente come il /usr/lib/x86_64-linux-gnu/libboost_filesystem.so

    quindi specificare il percorso come: -L/usr/lib/x86_64-linux- GNU/

Ora come trovare rispettiva libreria?

  1. Dipende da quello spinta Funzionalità/moduli si utilizza

    ad esempio: Se si utilizza spinta threading, si richiederà seguenti librerie

    libboost_filesystem.so

    libboost_thread.così

    libboost_system.so

  2. Aggiungere sopra librerie come segue con l'opzione -l:

    -l lboost_filesystem

    -l lboost_thread

    - l lboost_system

auguriamo che questo ti aiuta, inoltre Se non c'è modo più semplice, si prega di suggerire