2013-02-24 6 views
11

Ich möchte die Bibliothek cpp-netlib für ein C++ Projekt verwenden. Daher habe ich die Boost-Bibliothek mit Hilfe von Homebrew installiert (OS ist Mac OS X 10.8). Dann habe ich cpp-netlib von der Projekthomepage heruntergeladen, cmake verwendet, um das Makefile für g ++ zu erstellen, und erfolgreich make angewendet. "make test" bestanden alle seine Tests. Dann habe ich den Include-Ordner von cpp-netlib in das boost-Verzeichnis kopiert.Wie verlinkt man gegen cpp-netlib

Also hier ist, wenn der Fehler begann: Ich habe versucht, die erste Beispiel http-client der Dokumentation zu kompilieren, konnte es aber nicht zum Laufen bringen. Als ich

verwendet
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 

erhielt ich diese Linkerfehler:

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 

habe ich wirklich die Funktion Suche, aber ich konnte keine Lösung für mein Problem finden. Was mache ich falsch?

Vielen Dank!

Antwort

9

Nach dem Bau cpp-netlib (> = 0.9.3) soll es 3 statische Bibliotheken:

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

Wenn Ihr http-Client-Projekt erstellen, sollten Sie eine Bibliothek Pfad für cpp-netlib (angeben - L) und Bibliotheken zu verknüpfen (-l) gegen: cppnetlib-uri und libcppnetlib-client-connections.

+2

dank dir funktioniert das beispiel jetzt endlich! falls jemand das selbe Problem hat: hier ist die Zeile, die (nach dem Kompilieren der zusätzlichen Bibliotheken) endlich den Trick für mich gemacht hat: g ++ test.cpp -o aus -I/usr/local/Keller/boost/1.53. 0/include -L/usr/local/Keller/boost/1.53.0/lib -lboost_system-mt -lboost_filesystem-mt -lboost_thread-mt -lcppnetlib-klient-verbindungen -lcppnetlib-uri -lcppnetlib-server-parser -lssl - lcrpto – user1462040

0

Falls jemand das gleiche Problem mit Visual Studio hat, stellen Sie dem Linker die Bibliothekseingabe zur Verfügung.

Projekteigenschaften> Linkers> input>

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

für Debug-Konfiguration und

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

für Release-Konfiguration.

den Bibliothekspfad Geben Sie hier an,

Projekteigenschaften> Linkers> Allgemein> Weitere Einfügeverzeichnisse

2

Hier ist, was für mich gearbeitet. Sie müssen bestimmte Teile modifizieren, um mit verschiedenen Boost-Versionen, verschiedenen Installationspfaden usw. umgehen zu können.

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 

Wenn Sie serverseitigen Code schreiben, dann stelle ich mir Sie auch -lcppnetlib-server-parsers enthalten müssen.