2013-02-24 13 views
11

Chciałbym korzystać z biblioteki cpp-netlib dla projektu C++. Dlatego zainstalowałem bibliotekę boost przy pomocy homebrew (OS to Mac OS X 10.8). Następnie ściągnąłem cpp-netlib ze strony domowej projektów, użyłem cmake do stworzenia Makefile dla g ++ i z powodzeniem zastosowałem make. "make test" przeszedł wszystkie testy. Następnie skopiowałem folder include cpp-netlib do katalogu boost.Jak połączyć się z cpp-netlib

Tak oto, kiedy zaczął się problem: Próbowałem skompilować pierwszy przykład dokumentacji http-client, ale nie udało mi się go uruchomić. Kiedy użyłem

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 

dostałam te błędy linkera:

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 

Naprawdę użył funkcji wyszukiwania, ale nie mogłem znaleźć żadnego rozwiązania mojego problemu. Co ja robię źle?

Wielkie dzięki!

Odpowiedz

9

Po CPP-netlib budowy (> = 0.9.3) Powinny 3 bibliotek statycznych:

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

Budując swój projekt http-client, należy określić ścieżkę biblioteki dla CPP-netlib (- L) i biblioteki do połączenia (-l) z: cppnetlib-uri i libcppnetlib-client-connections.

+2

dzięki Wam przykład wreszcie działa! na wypadek, gdyby ktoś miał ten sam problem: oto linia, która (po skompilowaniu dodatkowych bibliotek) w końcu mi pomogła: 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

Jeśli ktoś ma ten sam problem ze studiem graficznym, podaj wejście biblioteki do linkera.

Właściwości projektu> Linker> input>

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

dla konfiguracji Debug i

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

konfiguracji Release.

bibliotece Określ ścieżkę tutaj, właściwości

projektowe> Linker> Ogólne> dodatkowe obejmują katalogi

2

Oto co pracował dla mnie. Będziesz musiał zmodyfikować określone części, aby poradzić sobie z różnymi wersjami boost, różnymi ścieżkami instalacji i tak dalej.

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 

Jeśli pisania kodu po stronie serwera, a potem wyobrazić będzie trzeba także zawierać -lcppnetlib-server-parsers.