添加自定义clang-tidy模块后自定义检查未显示的问题排查
clang-tidy自定义模块sw检查项未显示的排查与解决
可能的问题点与对应解决步骤
1. 确认模块库被clang-tidy主程序正确链接
你已将clangTidySWModule加入ALL_CLANG_TIDY_CHECKS,但需确保clang-tidy主目标确实链接了这个变量:
- 打开
/clang-tools-extra/clang-tidy/CMakeLists.txt,找到target_link_libraries(clang-tidy ...)段落,确认其中包含${ALL_CLANG_TIDY_CHECKS}。若缺失,添加如下配置:target_link_libraries(clang-tidy PRIVATE ${ALL_CLANG_TIDY_CHECKS} # 保留原有其他依赖项 )
2. 强制保留Anchor符号,避免被链接器优化
LLVM/Clang的链接器可能因静态库未被直接引用而将其优化掉,Anchor变量的作用是强制链接,但编译器可能会优化无引用的变量。修改SWTidyModule.cpp中的Anchor定义,添加__attribute__((used))属性:
namespace clang { namespace tidy { namespace sw { // 保留原有模块注册代码 } // namespace sw __attribute__((used)) volatile int SWModuleAnchorSource = 0; } // namespace tidy } // namespace clang
3. 验证检查类的命名空间正确性
确保add_new_check.py生成的检查类位于clang::tidy::sw命名空间下:
- 打开
AllCapsEnumeratorsCheck.h和CatchByConstReferenceCheck.h,确认命名空间声明为:namespace clang { namespace tidy { namespace sw { class AllCapsEnumeratorsCheck : public ClangTidyCheck { // 类内容 }; } // namespace sw } // namespace tidy } // namespace clang
命名空间错误会导致模块无法正确注册检查项。
4. 验证编译与链接过程
- 重新构建时查看日志,确认
clangTidySWModule库成功编译(生成libclangTidySWModule.a或对应动态库)。 - 用以下命令检查clang-tidy二进制是否包含模块符号:
nm ./clang-tidy | grep "sw-all-caps-enumerators"
若输出为空,说明模块未被链接到clang-tidy中,需重新检查CMake配置。
5. 清理构建目录后重新编译
旧构建缓存可能导致配置不生效,清理后重新构建:
cd <你的构建目录> rm -rf ./* cmake <clang源码目录> -DCMAKE_BUILD_TYPE=Release make clang-tidy -j$(nproc)
内容的提问来源于stack exchange,提问作者SebastianWilke
相关产品推荐
相关产品推荐

