使用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
相关产品推荐
相关产品推荐

