Я хотел бы использовать библиотеку cpp-netlib для проекта C ++. Поэтому я установил библиотеку boost с помощью homebrew (ОС Mac OS X 10.8). Затем я скачал cpp-netlib с домашней страницы проектов, использовал cmake для создания Makefile для g ++ и успешно применил make.
«make test» прошел все свои испытания. Затем я скопировал папку include cpp-netlib в каталог boost.
Итак, вот когда начались неприятности:
Я попытался скомпилировать первый пример документации HTTP-клиент но не мог заставить его работать. Когда я использовал
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
Я действительно использовал функцию поиска, но не смог найти решения для своей проблемы. Что я делаю неправильно?
Большое спасибо!
После сборки cpp-netlib (> = 0.9.3) должны появиться 3 статические библиотеки:
libcppnetlib-client-connections.a
libcppnetlib-server-parsers.a
libcppnetlib-uri.a
При сборке проекта http-клиента вы должны указать путь к библиотеке для cpp-netlib (-L) и библиотеки для ссылки (-L) против: cppnetlib-uri
а также libcppnetlib-client-connections
,
Вот что сработало для меня. Вам нужно будет изменить определенные части, чтобы они работали с разными версиями 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
,
Если у кого-то возникла такая же проблема с Visual Studio, предоставьте входные данные библиотеки для компоновщика.
Свойства проекта> Линкер> вход>
libcppnetlib-client-connectionsd.lib
libcppnetlib-urid.lib
для настройки отладки и
libcppnetlib-client-connections.lib
libcppnetlib-uri.lib
для конфигурации выпуска.
Укажите путь к библиотеке здесь,
Свойства проекта> Linker> general> Дополнительные каталоги включения