неопределенная ссылка на функцию в другой библиотеке, когда некоторые функции из нее доступны - PullRequest
0 голосов
/ 05 февраля 2020

Настройка : библиотека com использует библиотеку http, которая в пространстве имен http содержит класс ConnectionPool. ConnectionPool имеет метод boost::network::http::client::response post(boost::network::http::client::request req);

, где http_request boost::network::http::client::request

env :

c++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
GNU Make 4.1
Cmake 3.15.3

Файлы :

Так объявляется функция

boost::network::http::client::response
    post(boost::network::http::client::request req, unsigned timeoutMs);

post() называется так в com

connectionPool.post(http_request, 4000);

У меня странная проблема с конфигурацией CMake: при использовании post в com linker ( ld) возвращает 1 с ошибкой:

undefined reference to http::HTTPConnectionPool::post(boost::network::http::basic_request<boost::network::http::tags::http_default_8bit_udp_resolve>)'

Однако, если я удаляю запрос на повышение из подписи post, все компилируется и работает просто отлично. Исходя из этого, я могу сделать вывод, что проблема заключается в связывании boost с библиотекой http, но я не могу ее найти, поэтому вот CMakeFile

http / CMakeLists.txt

aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} http_srcs)
add_library(http ${http_srcs})
target_link_libraries(http PRIVATE pthread ${Boost_LIBRARIES} cppnetlib-uri)

com / CMakeFiles.txt

aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} com_srcs)
add_library(com ${com_srcs})
target_link_libraries(com PRIVATE jsoncpp cppnetlib-uri ${OpenCV_LIBRARIES} ${Boost_LIBRARIES})

связывая их вместе в main / CMakeLists.txt

# some code skipped there
target_link_libraries(main
                      config api rdm anm web com http dab log jsoncpp
                      ${Boost_LIBRARIES}
        )

Я уже пробовал:

  1. переименовываем пространство имен из http во что-то другое, чтобы проверить, возможно ли столкновение
  2. ссылка http на com в com/CMakeLists.txt
  3. изменить порядок в main / CMakeLists.txt target_link_libraries ()
  4. этот ответ { ссылка }

Другие функции и конструкторы из ConnectionPool работают нормально, проблема возникает только при использовании запроса на повышение в качестве одного из параметров.

Странно то, что функция с такой же сигнатурой работает в com.

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