Question Comment créer un lien avec cpp-netlib


Je voudrais utiliser la bibliothèque cpp-netlib pour un projet C ++. J'ai donc installé la bibliothèque boost à l'aide de homebrew (le système d'exploitation est Mac OS X 10.8). Puis j'ai téléchargé cpp-netlib depuis la page d'accueil des projets, utilisé cmake pour créer le Makefile pour g ++ et appliqué avec succès. "make test" a passé tous ses tests. Ensuite, j'ai copié le dossier include de cpp-netlib dans le répertoire boost.

Alors, voici quand le problème a commencé: J'ai essayé de compiler le premier exemple de la documentation client http mais ne pouvait pas le faire fonctionner. Quand j'ai utilisé

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

J'ai reçu ces erreurs de 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

J'ai vraiment utilisé la fonction de recherche mais je n'ai trouvé aucune solution à mon problème. Qu'est-ce que je fais mal?

Merci beaucoup!


11
2018-02-24 18:51


origine


Réponses:


Après la construction de cpp-netlib (> = 0.9.3), il devrait y avoir 3 bibliothèques statiques:

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

Lors de la construction de votre projet http-client, vous devez spécifier un chemin de bibliothèque pour cpp-netlib (-L) et bibliothèques à lier (-l) contre: cppnetlib-uri et libcppnetlib-client-connections.


9
2018-02-24 21:37



Voici ce qui a fonctionné pour moi. Vous devrez modifier certaines pièces pour gérer différentes versions de boost, différents chemins d'installation, etc.

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

Si vous écrivez du code côté serveur, j'imagine que vous devrez également inclure -lcppnetlib-server-parsers.


2
2018-05-25 22:49



Si quelqu'un a le même problème avec Visual Studio, fournissez l'entrée de la bibliothèque à l'éditeur de liens.

Propriétés du projet> Linker> input>

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

pour la configuration de débogage et

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

pour la configuration de la version.

Spécifiez le chemin de la bibliothèque ici,

Propriétés du projet> Linker> general> Répertoires d'inclusion supplémentaires


0
2018-03-07 05:11