【发布时间】:2026-01-21 12:50:03
【问题描述】:
我并不是在询问以某种方式支持 Cppcheck 的各种可用第三方模块。
在 CMake 3.10 中,CMake 似乎获得了一些官方的 Cppcheck 支持。见CMAKE_<LANG>_CPPCHECK。
不幸的是,如何使用这个变量的文档有点稀疏。有没有一个很好的例子来说明 Cppcheck 应该如何与 CMake 3.10(或更高版本)一起使用?
【问题讨论】:
我并不是在询问以某种方式支持 Cppcheck 的各种可用第三方模块。
在 CMake 3.10 中,CMake 似乎获得了一些官方的 Cppcheck 支持。见CMAKE_<LANG>_CPPCHECK。
不幸的是,如何使用这个变量的文档有点稀疏。有没有一个很好的例子来说明 Cppcheck 应该如何与 CMake 3.10(或更高版本)一起使用?
【问题讨论】:
simple example 将是 - 如果您的 PATH 中有 cppcheck 并且您没有指定其他参数 - 通过设置全局 CMAKE_<LANG>_CPPCHECK 变量如下:
cmake_minimum_required(VERSION 3.10)
project(CppCheckTest)
file(
WRITE "main.cpp"
[=[
int main()
{
char a[10];
a[10] = 0;
return 0;
}
]=]
)
set(CMAKE_CXX_CPPCHECK "cppcheck")
add_executable(${PROJECT_NAME} "main.cpp")
要扫描的文件会自动添加到cppcheck 命令行。所以上面的例子给出了以下输出(Linux系统上的gcc和cppcheck):
# make
Scanning dependencies of target CppCheckTest
[ 50%] Building CXX object CMakeFiles/CppCheckTest.dir/main.cpp.o
Checking .../CppCheckTest/main.cpp...
Warning: cppcheck reported diagnostics:
[/mnt/c/temp/*/CppCheckTest/main.cpp:4]: (error) Array 'a[10]' accessed at index 10, which is out of bounds.
[100%] Linking CXX executable CppCheckTest
[100%] Built target CppCheckTest
您可以在现有项目中尝试cppcheck,只需通过cmake 命令行设置CMAKE_CXX_CPPCHECK 变量:
# cmake -DCMAKE_CXX_CPPCHECK:FILEPATH=cppcheck ..
一个更“日常生活”的例子可能会让你在你的CMakeList.txt 中包含类似以下代码 sn-p 的内容:
find_program(CMAKE_CXX_CPPCHECK NAMES cppcheck)
if (CMAKE_CXX_CPPCHECK)
list(
APPEND CMAKE_CXX_CPPCHECK
"--enable=warning"
"--inconclusive"
"--force"
"--inline-suppr"
"--suppressions-list=${CMAKE_SOURCE_DIR}/CppCheckSuppressions.txt"
)
endif()
参考文献
<LANG>_CPPCHECK target property
仅当
<LANG>为C或CXX时才支持此属性。指定一个包含
cppcheck静态分析工具命令行的;-list。 Makefile 生成器和 Ninja 生成器将与编译器一起运行cppcheck并报告任何问题。如果在创建目标时设置了
CMAKE_<LANG>_CPPCHECK变量的值,则该属性将被初始化。
【讨论】:
CMAKE_CXX_CPPCHECK。否则构建系统不会获取CMAKE_CXX_CPPCHECK 的值。通过在我的CMakeLists.txt 中手动将变量设置为CACHE 变量,我几乎可以正常工作,但即使如此,configure 也必须运行 两次 才能使用生成器获取更新的CMAKE_CXX_CPPCHECK 值。猜测:构建文件的写入顺序错误。恐怕唯一的可移植解决方案是自定义目标。
-jX 调用 make 时,cppcheck 输出是乱码且无法读取。