如何使用cmake与boost asio?

4

我无法在我的C++程序中使用cmake与boost::asio配合使用。我已经尝试了很多次并进行了谷歌搜索,但我无法让它工作!

我想在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 没有抛出任何错误,但链接也无法正常工作。我明确告诉 CMake 在哪里找库,为什么 CMake 找不到 Boost?

1
asio.hpp 的完整路径是什么? - n. m.
如果链接失败,那么链接器错误信息将有助于每个人协助您。 - Jorge Bellon
这个回答解决了你的问题吗?在cMake中使用boost.asio - Paul Varghese
2个回答

2

试试这个。

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})

9
仅提供代码的回答不好。请解释为什么这样做可以修复问题。 - Kuba hasn't forgotten Monica
我尝试了这个,但不幸的是它没有按预期工作,它告诉我: 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但找不到这个库呢? - U_flow
2
回答@Kubahasn'tforgottenMonica的评论,应该可以工作,因为虽然boost asio只是一个头文件,但它依赖于boost system进行错误处理,因此它链接到boost system二进制文件。@U_flow听起来你还没有构建boost。您可以根据此处的说明进行构建:https://www.boost.org/doc/libs/1_75_0/more/getting_started/unix-variants.html,或者更简单的方法是仅安装它,请参见:https://dev59.com/5Wcs5IYBdhLWcg3wym4h。请注意,Ubuntu可能会安装比1.74或1.75(最新版本)旧的版本。 - kenba
2
在这里,find_package 关键字的 COMPONENTS 大小写敏感。错误消息列出了缺少库的 Components - vre
顺便提一下,你漏掉了一个调用 target_include_directories(${PROJECT_NAME} PRIVATE ${Boost_INCLUDE_DIRS}) - vre
@kenba 或许你是对的,我可能还没有(成功地)构建 Boost!我刚刚重新阅读了构建文档,“lib”文件夹应该被构建(尽管我有一个名为“libs”的文件夹,带有“s”)。 我没有使用 apt-get install,因为它给我抛出了一堆“未安装依赖项错误”,所以我认为直接从源代码安装会更容易,但我想某些依赖项是必需的... - U_flow

1

我之前也遇到了类似的问题,发现在Boost安装过程中漏掉了一个小但重要的步骤:将安装目录(即b2 install --prefix=PREFIX中使用的PREFIX)添加到PATH环境变量中。

对我来说,这个方法解决了问题,希望对你也有用!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接