2013-02-24 19 views
11

Vorrei usare la libreria cpp-netlib per un progetto C++. Pertanto ho installato la libreria boost con l'aiuto di homebrew (il sistema operativo è Mac OS X 10.8). Poi ho scaricato cpp-netlib dalla home page dei progetti, ho usato cmake per creare il Makefile per g ++ e applicato con successo make. "make test" ha superato tutti i test. Quindi ho copiato la cartella include di cpp-netlib nella directory boost.Come collegarsi a cpp-netlib

Quindi ecco quando il problema è iniziato: Ho provato a compilare il primo esempio della documentazione http-client ma non riuscivo a farlo funzionare. Quando ho usato

g++ test.cpp -o out -I/usr/local/Cellar/boost/1.53.0/include 
-L/usr/local/Cellar/boost/1.53.0/lib 
-lboost_system-mt -lboost_filesystem-mt -lboost_thread-mt 

ho ricevuto questi errori di linker:

Undefined symbols for architecture x86_64: 
    "boost::network::uri::detail::parse(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::network::uri::detail::uri_parts<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)", referenced from: 
     boost::network::uri::uri::parse() in ccs87Dq3.o 
    "boost::network::http::impl::normal_delegate::normal_delegate(boost::asio::io_service&)", referenced from: 
     boost::network::http::impl::connection_delegate_factory<boost::network::http::tags::http_async_8bit_udp_resolve>::new_connection_delegate(boost::asio::io_service&, bool, boost::optional<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::optional<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >)in ccs87Dq3.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

ho usato molto la funzione di ricerca, ma non sono riuscito a trovare una soluzione per il mio problema. Che cosa sto facendo di sbagliato?

Grazie mille!

risposta

9

Dopo aver costruito cpp-netlib (> = 0.9.3) ci dovrebbe 3 librerie statiche:

libcppnetlib-client-connections.a 
libcppnetlib-server-parsers.a 
libcppnetlib-uri.a 

Quando si costruisce il progetto http-client, è necessario specificare un percorso libreria per CPP-netlib (- L) e librerie per collegare (-l) rispetto a: cppnetlib-uri e libcppnetlib-client-connections.

+2

grazie a voi l'esempio sta finalmente funzionando ora! nel caso qualcuno abbia lo stesso problema: ecco la riga che (dopo aver compilato le librerie aggiuntive) finalmente ha fatto il trucco per me: g ++ test.cpp -o out -I/usr/local/Cellar/boost/1.53. 0/include -L/usr/local/Cellar/boost/1.53.0/lib -lboost_system-mt -lboost_filesystem-mt -lboost_thread-mt -lcppnetlib-client-connections -lcppnetlib-uri -lcppnetlib-server-parsers -lssl - lcrypto – user1462040

0

Nel caso in cui qualcuno abbia lo stesso problema con Visual Studio, fornire l'input della libreria al linker.

Proprietà progetto> Linker> ingresso>

libcppnetlib-client-connectionsd.lib 
libcppnetlib-urid.lib 

per la configurazione di debug e

libcppnetlib-client-connections.lib 
libcppnetlib-uri.lib 

per la configurazione di uscita.

Specificare il percorso della libreria qui, proprietà

progetto> Linker> Generali> aggiuntive includono directory

2

Ecco cosa ha funzionato per me. Sarà necessario modificare alcune parti per gestire diverse versioni di boost, percorsi di installazione diversi e così via.

g++ -o demo \ 
    demo.cpp \ 
    -lcppnetlib-uri \ 
    -lcppnetlib-server-parsers \ 
    -lcppnetlib-client-connections \ 
    -lboost_thread-mt \ 
    -lboost_system-mt \ 
    -lssl \ 
    -lcrypto \ 
    -I/usr/local/include \ 
    -L/usr/local/lib 

Se si sta scrivendo codice lato server, allora immagino si dovrà anche includere -lcppnetlib-server-parsers.

Problemi correlati