c++ - 当其他库中的某些函数可用时,未定义对其他库中的函数的引用
问题描述
设置:库com
使用http
名称空间http
中包含类的库ConnectionPool
。ConnectionPool
有方法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 如何包含在粘贴箱中
这就是函数的声明方式
boost::network::http::client::response
post(boost::network::http::client::request req, unsigned timeoutMs);
post()
在 com 中是这样称呼的
connectionPool.post(http_request, 4000);
我对 CMake 配置有一个奇怪的问题:post
在com
链接器 (ld) 中使用时返回 1 并出现错误:
undefined reference to http::HTTPConnectionPool::post(boost::network::http::basic_request<boost::network::http::tags::http_default_8bit_udp_resolve>)'
但是,如果我从 的签名中删除 boost 请求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}
)
我已经尝试过:
- 将命名空间从 http 重命名为其他名称以检查是否可能发生冲突
- 将http链接到com in
com/CMakeLists.txt
- 在 main/CMakeLists.txt target_link_libraries() 中更改顺序
- 这个答案https://stackoverflow.com/a/12205075/6429920
另一个函数和构造函数ConnectionPool
工作正常,只有在使用 boost request 作为参数之一时才会出现问题。
奇怪的是具有相同签名的功能适用于com
.
解决方案
推荐阅读
- php - 用户注册后重定向到登录页面。拉拉维尔 5.5
- dialogflow-es - 如何在 Google Assistant 上的帐户链接中替换默认响应
- javascript - Postman 测试 - 使用 http 状态进行调节
- angular - Angular 7 Http响应
- python - 如何在 Pygame 上使用摇杆同时移动和射击?
- python - Python字典通过迭代交换元素值
- c - Hiding number in large pointer array by modifying least significant bit of elements
- c++ - 我怎么可能更快地搜索排序的二叉树?
- scala - 绝对 URI 中的相对路径:txt Spark mac
- mongodb - 在 mongodb 中执行此操作的最佳方法是什么?