Как подключиться к cpp-netlib

Я хотел бы использовать библиотеку cpp-netlib для проекта С++. Поэтому я установил библиотеку boost с помощью homebrew (ОС - Mac OS X 10.8). Затем я загрузил cpp-netlib с домашней страницы проектов, использовал cmake для создания Makefile для g++ и успешно применил make. "make test" прошел все свои тесты. Затем я скопировал папку include cpp-netlib в каталог boost.

Итак, вот когда начались неприятности: Я попытался скомпилировать первый пример документации http-client, но не смог заставить его работать. Когда я использовал

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

Я получил эти ошибки компоновщика:

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

Я действительно использовал функцию поиска, но не смог найти решения для моей проблемы. Что я делаю не так?

Спасибо большое!

Ответ 1

После создания cpp-netlib ( >= 0.9.3) должно быть 3 статических библиотеки:

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

При создании вашего проекта http-client вы должны указать путь библиотеки для cpp-netlib (- L) и библиотеки для ссылки (- l) на: cppnetlib-uri и libcppnetlib-client-connections.

Ответ 2

Вот что сработало для меня. Вам нужно будет изменить некоторые части, чтобы иметь дело с различными версиями boost, разными путями установки и т.д.

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

Если вы пишете код на стороне сервера, я думаю, вам также потребуется включить -lcppnetlib-server-parsers.

Ответ 3

Если у кого-то есть такая же проблема с визуальной студией, предоставите библиотечный вход в компоновщик.

Свойства проектa > Linker > input >

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

для конфигурации отладки и

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

для конфигурации Release.

Укажите здесь путь к библиотеке,

Свойства проектa > Linker > general > Дополнительные каталоги