【问题标题】:Use -I instead of -isystem when using CMake find_package in compile_commands.json在 compile_commands.json 中使用 CMake find_package 时使用 -I 而不是 -isystem
【发布时间】:2019-08-03 10:22:42
【问题描述】:

我的问题基本上是这个 SO 问题的反面 - 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 知道这不是 system 库而是 local 库(尤其是如果我将它安装到不是默认安装位置使用CMAKE_INSTALL_PREFIX 和更高版本的CMAKE_PREFIX_PATH

这让我感到痛苦的原因是我想使用cppcheck 来分析这些文件,但它(明智地)忽略了它认为是system 包括的所有文件。

$ 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/17348https://gitlab.kitware.com/cmake/cmake/issues/17364看到更多信息

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

【问题讨论】:

    标签: cmake cppcheck


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 2014-07-20
      • 2017-05-08
      • 2018-11-16
      • 1970-01-01
      • 2018-01-09
      相关资源
      最近更新 更多