首页 > 解决方案 > 当其他库中的某些函数可用时,未定义对其他库中的函数的引用

问题描述

设置:库com使用http名称空间http中包含类的库ConnectionPoolConnectionPool有方法boost::network::http::client::response post(boost::network::http::client::request req);

http_request 在哪里boost::network::http::client::request

环境

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 配置有一个奇怪的问题:postcom链接器 (ld) 中使用时返回 1 并出现错误:

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

但是,如果我从 的签名中删除 boost 请求post,一切都会编译并正常工作。由此我可以得出结论,问题在于链接boosthttp库,但我找不到它,所以这里是 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 incom/CMakeLists.txt
  3. 在 main/CMakeLists.txt target_link_libraries() 中更改顺序
  4. 这个答案https://stackoverflow.com/a/12205075/6429920

另一个函数和构造函数ConnectionPool工作正常,只有在使用 boost request 作为参数之一时才会出现问题。

奇怪的是具有相同签名的功能适用于com.

标签: c++boostcmake

解决方案


推荐阅读