cmake - 在compile_commands.json中使用CMake find_package时使用-I而不是-isystem

标签 cmake cppcheck

我的问题基本上是这个问题的反面 - Use -isystem instead of -I with CMake

我正在测试一个库,测试应用程序通过 CMake 的 find_package 引入该库

# CMakeLists.txt

...
find_package(as REQUIRED)
add_executable(as-tests tests.cpp ...)
target_link_libraries(as-tests as::as)
...

这一切都工作正常,但问题是 CMake 似乎将 -isystem 添加到以这种方式引入的所有包含路径中,而不是使用 target_include_directories 。这是我生成 compile_commands.json 文件时看到的内容。

# compile_commands.json

...
{
  "directory": ...
  "command": ... -isystem <full/path/to/as/include/>" ...
  "file": ...
},
...

我想知道是否可以向 find_package 传递一个标志或设置,让 CMake 知道这不是一个系统库,而是一个本地 > 一个(特别是如果我使用 CMAKE_INSTALL_PREFIX 和更高版本的 CMAKE_PREFIX_PATH 将其安装到非默认安装位置的位置。

这让我痛苦的原因是我想使用cppcheck来分析这些文件,但它(明智地)忽略了它认为是系统包含的所有文件.

$ cppcheck --project=compile_commands.json --language=c++ --std=c++17 --enable=all

# will not analyse any includes with -isystem prefix

总之,我可以做类似 find_package(as REQUIRED NOT_SYSTEM) 的事情来让正常的 -I 出现在 compile_commands.json 中吗? >?

谢谢! :)


更新:

@mathstuf 是 100% 正确的(感谢您的回答!)我想稍微扩展一下这一点,因为当前的情况并不完全是我想要的......

可以在您正在构建的目标上设置NO_SYSTEM_FROM_IMPORTED,但不能在导入的目标上设置。

例如你可以这样做:

project(app LANGUAGES CXX)

add_executable(
    ${PROJECT_NAME} main.cpp)
set_target_properties(
    ${PROJECT_NAME} PROPERTIES
    NO_SYSTEM_FROM_IMPORTED true)

但你不能这样做:

find_package(lib REQUIRED)
set_target_properties(
    lib::lib PROPERTIES
    NO_SYSTEM_FROM_IMPORTED true)

这没关系,但这意味着如果您有多个导入的目标,您无法选择一个特定的库作为 -I 并选择另一个库作为 -isystem ( -isystem 是所有导入目标的默认值。

您可以在此处查看更多信息 https://gitlab.kitware.com/cmake/cmake/issues/17348在这里https://gitlab.kitware.com/cmake/cmake/issues/17364

我想我现在只能忍受一切都是-I

最佳答案

有目标属性NO_SYSTEM_FROM_IMPORTED您可以在消费目标上进行设置以删除该行为。

关于cmake - 在compile_commands.json中使用CMake find_package时使用-I而不是-isystem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57337426/

相关文章:

cppcheck - 为什么静态分析工具会忽略这个看似显而易见的情况?

c++ - 让 CMake 为 Visual Studio 中的单个源文件设置 "Exclude From Build"选项

c++ - 什么会导致 VS2010 无法从头文件中包含,但不能从实现文件中包含?

cmake - 为目标生成程序集

c++ - 如何使用 cppcheck 忽略某些文件类型?

c++ - 运行时错误-UndefinedBehaviourSanitizer

cmake - 使用 CTest 将 BUILD_TESTING 默认设置为 OFF

c++ - 使用 CMake 交叉编译 : linker errors

c++ - 自动检测相同的连续 std::string::find() 调用

c++ - 在包含 float 的结构上使用 memset()