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

Windows环境下clang-tidy无法识别boost::asio::awaitable<void>的问题求助

CMake+C++20项目Windows下clang-tidy识别boost::asio::awaitable报错的解决方法

问题背景

我维护的大型C++20项目用CMake构建,Windows和Linux平台编译运行均正常,但clang-tidy代码检查时出现平台差异:Linux(WSL/Ubuntu)下无错误,Windows平台针对函数原型:

boost::asio::awaitable<void> CoCreateClientConnection(std::string _peerName, std::string _networkAddress, uint16_t _port);

clang-tidy抛出错误:

ClientConnector.hpp:46:18: error: no template named 'awaitable' in namespace boost::asio' [clang-diagnostic-error]

环境版本

  • Boost 1.84
  • clang-tidy 17.0.1
  • Visual Studio 2022 cl.exe 19.37.32824
  • 注:Windows正常构建用MSBuild,clang-tidy需搭配Ninja作为CMake生成器执行

现有临时方案

查看Boost头文件发现,boost::asio::awaitable仅在定义BOOST_ASIO_HAS_CO_AWAIT宏时才会被暴露,而该宏的默认定义逻辑排除了__clang__,目前临时解决方式是在CMake中强制定义此宏。


正式解决方法(三选一)

方法1:让clang-tidy识别boost::asio::awaitable有效

通过为clang-tidy的编译上下文添加BOOST_ASIO_HAS_CO_AWAIT宏定义,确保检查工具能正确识别awaitable模板:

CMake配置方式

# 仅针对clang-tidy的检查流程添加宏定义
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_CXX_CLANG_TIDY)
    add_compile_definitions(BOOST_ASIO_HAS_CO_AWAIT)
endif()

.clang-tidy配置文件方式

Checks: '*'
# 保留其他原有配置...
ExtraArgs:
  - -DBOOST_ASIO_HAS_CO_AWAIT

方法2:精准跳过报错行的检查

如果不想全局修改宏定义,可以直接跳过报错的特定行:

CMake配置方式

set(CMAKE_CXX_CLANG_TIDY "clang-tidy;-line-filter=[{"name":"ClientConnector.hpp","lines":[[46,46]]}]")

.clang-tidy配置文件方式

LineFilter:
  - name: ClientConnector.hpp
    lines: [ [46, 46] ]

方法3:忽略所有boost::asio相关错误

通过clang-tidy的头文件过滤规则,直接跳过所有Boost Asio头文件的检查:

.clang-tidy配置文件方式

Checks: '*'
# 保留其他原有配置...
HeaderFilterRegex: '-boost/asio/'

CMake配置方式

set(CMAKE_CXX_CLANG_TIDY "clang-tidy;-header-filter=-boost/asio/")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 11:30:56