Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从cmake生成的命令中取消cppcheck分析中的定义_C++_Cmake_Cppcheck - Fatal编程技术网

C++ 从cmake生成的命令中取消cppcheck分析中的定义

C++ 从cmake生成的命令中取消cppcheck分析中的定义,c++,cmake,cppcheck,C++,Cmake,Cppcheck,我有一个用cppcheck 1.90检查的项目,但我想取消设置一些定义,因为检查所有定义需要很多时间 示例:tests.cpp: int main() { int x,y; #ifdef A x = 5; #else x = 10; #endif #ifdef B y = 5; #else y = 10; #endif #ifdef C y = 5*x; #else y = 10*x; #endif int c = x+y; } 当我在没有项目的情况下使用

我有一个用cppcheck 1.90检查的项目,但我想取消设置一些定义,因为检查所有定义需要很多时间

示例:
tests.cpp

int main() {
  int x,y;
#ifdef A
  x = 5;
#else
  x = 10;
#endif

#ifdef B
  y = 5;
#else
  y = 10;
#endif

#ifdef C
  y = 5*x;
#else
  y = 10*x;
#endif

  int c = x+y;
}
当我在没有项目的情况下使用文件时-没有问题:

cppcheck ../tests.cpp --force -UB
Checking ../tests.cpp ...
Checking ../tests.cpp: A...
Checking ../tests.cpp: C...
我取消设置define B,cppcheck不使用B检查编译路径。 但是如何使用cmake项目生成的文件呢

cmake ../ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
cppcheck --project=./compile_commands.json --force -UB
Checking /home/builder/bugs/test_cppcheck/tests.cpp ...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: A...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: B...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: C...
如我所见,cppcheck被忽略“-U”键。在这种情况下有没有办法取消设置定义

为测试示例添加cmakefile:

CMakeLists.txt
cmake_minimum_required(VERSION 3.6)

project(tests)

set(SRC
    tests.cpp
)

set(NAME test)
add_executable(${NAME} ${SRC})


可能的决定之一是更改CMakeLists文件(取消定义):

输出为:

$ cmake ../ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
-- Configuring done
-- Generating done
-- Build files have been written to: /home/builder/bugs/test_cppcheck/build
$ cppcheck --project=./compile_commands.json --force
Checking /home/builder/bugs/test_cppcheck/tests.cpp ...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: A...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: C...

没有“B”路径检查。
但如果存在不更改CmakeList的解决方案,则更好。

一个可能的决定是更改CmakeList文件(未设置定义):

输出为:

$ cmake ../ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
-- Configuring done
-- Generating done
-- Build files have been written to: /home/builder/bugs/test_cppcheck/build
$ cppcheck --project=./compile_commands.json --force
Checking /home/builder/bugs/test_cppcheck/tests.cpp ...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: A...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: C...

没有“B”路径检查。
但是,如果存在不更改CmakeList的解决方案,那就更好了。

您可以选择只编辑CmakeList文件一次,并根据需要传递参数,要实现这一点,您应该

在CMakeLists文件中添加:

set(CMAKE\u CXX\u标志“${CMAKE\u CXX\u标志}*硬编码的\u标志*”)

命令行:


从命令行调用
cmake
时,您可以添加
cmake\u CXX\u标志=-UB=1
(或任何其他cppcheck标志),这将
-UB=1
连接到
硬编码的\u标志
,您可以选择只编辑一次CMakeLists文件,并根据需要传递参数,要做到这一点,你应该

在CMakeLists文件中添加:

set(CMAKE\u CXX\u标志“${CMAKE\u CXX\u标志}*硬编码的\u标志*”)

命令行:


从命令行调用
cmake
时,添加
cmake\u CXX\u标志=-UB=1
(或任何其他cppcheck标志),这将把
-UB=1
连接到
硬编码的\u标志
另一种方法是让
cmake
运行
cppcheck
本身。可以通过设置
CMAKE\u CXX\u CPPCHECK
(请参阅)。您可以在
CMakeLists.txt
中设置
CMAKE\u CXX\u CPPCHECK
,也可以在调用
CMAKE
的命令行上进行设置

这确实有一些缺点(例如,每个源文件都是单独检查的,因此跨文件检查不起作用)

但有几个优点:

  • 无需单独调用
    cppcheck
  • 如果在
    CMakeLists.txt
    中设置
    CMAKE\u CXX\u CPPCHECK
    ,还可以添加
    CPPCHECK
    命令行选项来控制它的功能。在您的情况下,可以添加
    -UB
  • 这有助于将如何构建和检查项目的所有知识封装到单个文件中(
    CMakeLists.txt
在我的
CMakeLists.txt中,我通常遵循这样的模式:

option(ENABLE_CODE_ANALYSIS "Run code analysis" OFF)
if(ENABLE_CODE_ANALYSIS)
    find_program(cppcheck cppcheck)
    message(STATUS "cppcheck    ${cppcheck}")
    if(NOT (cppcheck MATCHES "NOTFOUND"))
        set(CMAKE_CXX_CPPCHECK "${cppcheck}"
            "--enable=all"
            "--inconclusive"
            "--inline-suppr"
            "--quiet"
            "--suppress=missingInclude"
            "--suppress=unmatchedSuppression"
            "--suppress=unusedFunction"
            "--template='{file}:{line}: warning: {id} ({severity}): {message}'")
    endif()
endif(ENABLE_CODE_ANALYSIS)

然后您可以通过执行
cmake-DENABLE\u code\u analysis=ON

进行代码分析,另一种方法是让
cmake
运行
cppcheck
本身。可以通过设置
CMAKE\u CXX\u CPPCHECK
(请参阅)。您可以在
CMakeLists.txt
中设置
CMAKE\u CXX\u CPPCHECK
,也可以在调用
CMAKE
的命令行上进行设置

这确实有一些缺点(例如,每个源文件都是单独检查的,因此跨文件检查不起作用)

但有几个优点:

  • 无需单独调用
    cppcheck
  • 如果在
    CMakeLists.txt
    中设置
    CMAKE\u CXX\u CPPCHECK
    ,还可以添加
    CPPCHECK
    命令行选项来控制它的功能。在您的情况下,可以添加
    -UB
  • 这有助于将如何构建和检查项目的所有知识封装到单个文件中(
    CMakeLists.txt
在我的
CMakeLists.txt中,我通常遵循这样的模式:

option(ENABLE_CODE_ANALYSIS "Run code analysis" OFF)
if(ENABLE_CODE_ANALYSIS)
    find_program(cppcheck cppcheck)
    message(STATUS "cppcheck    ${cppcheck}")
    if(NOT (cppcheck MATCHES "NOTFOUND"))
        set(CMAKE_CXX_CPPCHECK "${cppcheck}"
            "--enable=all"
            "--inconclusive"
            "--inline-suppr"
            "--quiet"
            "--suppress=missingInclude"
            "--suppress=unmatchedSuppression"
            "--suppress=unusedFunction"
            "--template='{file}:{line}: warning: {id} ({severity}): {message}'")
    endif()
endif(ENABLE_CODE_ANALYSIS)

然后,你可以通过<代码> CGIS-DENABLE代码分析= < < /C++ > .< /P>你尝试设置C++标志吗?CMakeLists文件

设置(CMAKE_CXX_FLAGS“-D*您的_FLAGS*”
,发布您的CMakeLists文件会很有帮助。这是
cppcheck
的问题,您很可能]应该向他们报告一个错误。@joepol,谢谢!但最好是取消定义!你试过设置C++标志吗?CMakeLists文件
设置(CMAKE_CXX_FLAGS“-D*您的_FLAGS*”
,发布您的CMakeLists文件会很有帮助。这是
cppcheck
的问题,您很可能]应该向他们报告一个错误。@joepol,谢谢!但最好是取消定义!