You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CMake构建Boost.Asio时async_wait函数编译错误求助

问题描述

我正在学习Boost.Asio,同时尝试掌握CMake的使用,但IDE对async_wait函数报错。

代码示例

#include <boost/asio.hpp>
#include <iostream>
#include <functional>

void print(boost::system::error_code& ec) {
    std::cout << "Hello\n";
}

int main() {
    boost::asio::io_context io;
    boost::asio::steady_timer t(io, boost::asio::chrono::seconds(1));

    t.async_wait(std::bind(print, boost::asio::placeholders::error));
}

编译错误信息

E0304 missing instances of the "boost::asio" function template::basic_waitable_timer<Clock, WaitTraits, Executor>::async_wait [with Clock=std::chrono::steady_clock, WaitTraits=boost::asio::wait_traitsstd::chrono::steady_clock, Executor=boost::asio::any_io_executor] corresponding to the list of arguments

CMake配置

主目录CMakeLists.txt

cmake_minimum_required (VERSION 3.8)

 project ("BoostLer")

 set(BOOST_ROOT "C:\\boost")
 set(BOOST_LIBRARYDIR "${BOOST_ROOT}/lib")
 set(BOOST_INCLUDEDIR "${BOOST_ROOT}/include")

 find_package(boost REQUIRED COMPONENTS system filesystem)
 add_subdirectory("BoostLer")

子目录CMakeLists.txt

add_executable (BoostLer "BoostLer.cpp" )

 if (CMAKE_VERSION VERSION_GREATER 3.12)
   set_property(TARGET BoostLer PROPERTY CXX_STANDARD 20)
 endif()

 include_directories(${Boost_INCLUDE_DIRS})
 target_link_libraries(BoostLer PUBLIC ${BOOST_LIBRARIES})
解决方案

1. 代码层面错误修正

async_wait要求的回调函数参数类型不匹配:Boost.Asio异步操作传递的error_code是右值,但你的print函数接收的是非const左值引用,导致无法匹配函数模板实例。

修正方式二选一:

  • 将参数改为const引用:
void print(const boost::system::error_code& ec) {
    std::cout << "Hello\n";
}
  • 直接传值:
void print(boost::system::error_code ec) {
    std::cout << "Hello\n";
}

也可以改用Lambda表达式替代std::bind,更直观且不易出错:

t.async_wait([](const boost::system::error_code& ec) {
    std::cout << "Hello\n";
});

2. CMake配置优化

你的CMake配置存在规范问题,修正后确保Boost链接正确:

  • find_package的包名需大写为Boost
  • 用target_include_directories替代全局的include_directories,仅作用于当前目标
  • 直接链接Boost::system、Boost::filesystem目标库,避免使用变量${BOOST_LIBRARIES}

修改后主目录CMakeLists.txt

cmake_minimum_required(VERSION 3.8)

project("BoostLer")

set(BOOST_ROOT "C:\\boost")
set(BOOST_LIBRARYDIR "${BOOST_ROOT}/lib")
set(BOOST_INCLUDEDIR "${BOOST_ROOT}/include")

find_package(Boost REQUIRED COMPONENTS system filesystem)

add_subdirectory("BoostLer")

修改后子目录CMakeLists.txt

add_executable(BoostLer "BoostLer.cpp")

if(CMAKE_VERSION VERSION_GREATER 3.12)
  set_property(TARGET BoostLer PROPERTY CXX_STANDARD 20)
endif()

target_include_directories(BoostLer PRIVATE ${Boost_INCLUDE_DIRS})
target_link_libraries(BoostLer PRIVATE Boost::system Boost::filesystem)

内容的提问来源于stack exchange,提问作者zxctatar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 01:43:20