【问题标题】:Howto use cmake with boost asio?如何将 cmake 与 boost asio 一起使用?
【发布时间】:2021-05-06 02:26:28
【问题描述】:

我无法让 boost::asio 在我的 c++ 程序中使用 cmake。实际上,我已经尝试并在 Google 上搜索了很多小时,但我无法让它工作!

我想在我的 Ubuntu 18.04 下的 c++ 项目中包含 boost::asio 和一个 cmake 文件。

所以我安装了最新的 CMake (cmake version 3.19.4),并下载了 boost 1.74 版并执行了

./bootstrap.sh --prefix=/usr/
sudo ./b2 install

安装目录为/home/boost/boost_1_74_0。我的 CMake 文件如下所示:

cmake_minimum_required (VERSION 3.1.0)
# Project name
project (machine_tryout VERSION 1.0)

# Boost (header only)
#set(Boost_DEBUG 1)
set(BOOST_ROOT "$ENV{HOME}/boost/boost_1_74_0")
set(Boost_INCLUDE_DIR  "$ENV{HOME}/boost/boost_1_74_0")
set(Boost_LIBRARY_DIR "$ENV{HOME}/boost/boost_1_74_0/libs")
find_package(Boost REQUIRED Components asio) 
    
# Set Executable
add_executable(${PROJECT_NAME} source/tryout.cpp)

但我得到的一切如下:

vm-umic@vm:~/Projects/tryout/build$ cmake ..
CMake Warning at /snap/cmake/775/share/cmake-3.19/Modules/FindBoost.cmake:2034 (message):
  No header defined for asio; skipping header check (note: header-only
  libraries have no designated component)
Call Stack (most recent call first):
  CMakeLists.txt:27 (find_package)


CMake Error at /snap/cmake/775/share/cmake-3.19/Modules/FindPackageHandleStandardArgs.cmake:218 (message):
  Could NOT find Boost (missing: asio) (found version "1.74.0")
Call Stack (most recent call first):
  /snap/cmake/775/share/cmake-3.19/Modules/FindPackageHandleStandardArgs.cmake:582 (_FPHSA_FAILURE_MESSAGE)
  /snap/cmake/775/share/cmake-3.19/Modules/FindBoost.cmake:2193 (find_package_handle_standard_args)
  CMakeLists.txt:27 (find_package)


-- Configuring incomplete, errors occurred!
See also "/home/vm-umic/Projects/tryout/build/CMakeFiles/CMakeOutput.log".

我到底做错了什么? CMake 不是告诉我它找到了 Boost 1.74 吗?如果我尝试find_package(Boost REQUIRED),CMake NOT 会抛出任何错误,但是链接也不起作用。我明确告诉 CMake 在哪里可以找到库,那为什么 CMake 找不到 Boost?

【问题讨论】:

  • asio.hpp 的完整路径是什么?
  • 如果链接不起作用,那么链接器错误消息将有助于大家帮助您。
  • 这能回答你的问题吗? Using boost.asio in cMake

标签: c++ boost cmake boost-asio


【解决方案1】:

试试这个。

cmake_minimum_required (VERSION 3.1.0)
# Project name
project (machine_tryout VERSION 1.0)

# Boost (header only)
#set(Boost_DEBUG 1)
set(BOOST_ROOT "$ENV{HOME}/boost/boost_1_74_0")
set(Boost_INCLUDE_DIR  "$ENV{HOME}/boost/boost_1_74_0")
set(Boost_LIBRARY_DIR "$ENV{HOME}/boost/boost_1_74_0/libs")
find_package(Boost REQUIRED Components system) 
    
# Set Executable
add_executable(${PROJECT_NAME} source/tryout.cpp)
target_link_libraries(${PROJECT_NAME}
    ${Boost_LIBRARIES})

【讨论】:

  • 纯代码答案不好。请解释为什么这可以解决问题。
  • 我试过这个,不幸的是它没有按预期工作,它告诉我:CMake Error at /snap/cmake/775/share/cmake-3.19/Modules/FindPackageHandleStandardArgs.cmake:218 (message): Could NOT find Boost (missing: Components system) (found version "1.74.0") 也许我没有正确安装 boost?怎么能找到 boost 而不是这个库?
  • 回答@Kubahasn'tforgottenMonica 的评论,它应该可以工作,因为虽然boost asio 只是标题,但它依赖于boost system 进行错误处理,因此它链接到boost system 二进制文件。 @U_flow 听起来你还没有构建boost。您可以按照此处的说明构建它:boost.org/doc/libs/1_75_0/more/getting_started/…,或者通过安装它更容易,请参阅:stackoverflow.com/questions/12578499/…。请注意,Ubuntu 可能会安装比 1.74 或 1.75(最新)更旧的版本。
  • find_package 关键字 COMPONENTS 的情况在这里很重要。错误消息将 Components 列为缺少库。
  • 顺便说一句,你错过了对target_include_directories(${PROJECT_NAME} PRIVATE ${Boost_INCLUDE_DIRS})的电话
猜你喜欢
  • 2012-10-01
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 2013-03-02
  • 2023-04-07
  • 2021-07-12
相关资源
最近更新 更多