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

如何避免clang-tidy检查自动生成的代码文件?

问题:禁用Protobuf生成代码的clang-tidy检查

项目中Protobuf生成的C++文件会被clang-tidy扫描,产生大量无意义警告。当前采用在生成目录放置.clang-tidy文件禁用规则的方案,仍存在clang-tidy解析文件的时间损耗。现有CMake配置如下:

顶层CMakeLists.txt

# 全局启用clang-tidy
set(CMAKE_CXX_CLANG_TIDY ${CLANG_TIDY_EXECUTABLE}; --header-filter=.)

# 导入Protobuf生成文件的系统头目录
include_directories(SYSTEM ${CMAKE_BINARY_DIR}/grpc_interface)

target_link_libraries(${PROJECT_NAME}
    # ...
    grpc_services
)

grpc_interface/CMakeLists.txt

project(grpc_services)

set(PROTO_IMPORT_DIRS
    ${CMAKE_SOURCE_DIR}/protocols/protobuf/
)

set(PROTOS
    ${CMAKE_SOURCE_DIR}/protocols/protobuf/test_message.proto
)

add_library(${PROJECT_NAME} STATIC ${PROTOS})

target_link_libraries(${PROJECT_NAME}
    PUBLIC
        protobuf::libprotobuf
        gRPC::grpc++
)

get_target_property(GRPC_CPP_PLUGIN gRPC::grpc_cpp_plugin LOCATION)

protobuf_generate(
    TARGET ${PROJECT_NAME}
    IMPORT_DIRS ${PROTO_IMPORT_DIRS}
    LANGUAGE cpp
)

protobuf_generate(
    TARGET ${PROJECT_NAME}
    IMPORT_DIRS ${PROTO_IMPORT_DIRS}
    LANGUAGE grpc
    GENERATE_EXTENSIONS .grpc.pb.h .grpc.pb.cc
    PLUGIN "protoc-gen-grpc=${GRPC_CPP_PLUGIN}"
)

需要更高效的方式,仅禁用grpc_services目标的clang-tidy检查,避免不必要的解析开销。


解决方案

方法1:针对目标直接禁用clang-tidy

在grpc_interface/CMakeLists.txt的add_library语句之后,添加以下配置,直接覆盖全局clang-tidy设置:

# 禁用当前目标的clang-tidy检查
set_target_properties(${PROJECT_NAME} PROPERTIES
    CXX_CLANG_TIDY ""
)

此方法会让clang-tidy完全跳过grpc_services目标下的所有文件,彻底消除解析时间损耗,是最直接高效的方案。

方法2:调整全局header-filter排除生成目录

如果仅想跳过生成的头文件(仍检查.cc文件),可修改顶层的CMAKE_CXX_CLANG_TIDY参数,限制仅扫描源码目录下的头文件:

set(CMAKE_CXX_CLANG_TIDY ${CLANG_TIDY_EXECUTABLE}; --header-filter="^${CMAKE_SOURCE_DIR}/")

这种方式会让clang-tidy忽略CMAKE_BINARY_DIR下生成的头文件,但仍会处理生成的.cc文件,效率略低于方法1。

方法3:临时关闭全局clang-tidy后恢复

在生成Protobuf代码前临时清空全局clang-tidy配置,生成完成后恢复:

# 保存当前全局clang-tidy配置
set(OLD_CLANG_TIDY ${CMAKE_CXX_CLANG_TIDY})
# 临时禁用全局clang-tidy
set(CMAKE_CXX_CLANG_TIDY "")

protobuf_generate(
    TARGET ${PROJECT_NAME}
    IMPORT_DIRS ${PROTO_IMPORT_DIRS}
    LANGUAGE cpp
)

protobuf_generate(
    TARGET ${PROJECT_NAME}
    IMPORT_DIRS ${PROTO_IMPORT_DIRS}
    LANGUAGE grpc
    GENERATE_EXTENSIONS .grpc.pb.h .grpc.pb.cc
    PLUGIN "protoc-gen-grpc=${GRPC_CPP_PLUGIN}"
)

# 恢复全局clang-tidy配置
set(CMAKE_CXX_CLANG_TIDY ${OLD_CLANG_TIDY})

此方式适用于需要临时调整全局配置的场景,但不如方法1直接,因为grpc_services本身仅包含生成文件,针对目标禁用更合理。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:15:30