cmake - CMake:target_link_libraries包含为SYSTEM,以禁止编译器警告

标签 cmake

为了禁止源于我在应用程序中使用的库的编译器警告,在将它们添加到target_include_directories(myapp SYSTEM ...)之前,我手动将它们的目录包含在target_link_libraries作为系统库,如下所示:

add_executable(myapp myapp.cpp)
target_include_directories(myapp SYSTEM
  PRIVATE "extern/lib/include"
)
target_link_libraries(myapp lib::lib)


但是,如果lib的开发人员决定更改include路径,则这种感觉会很棘手,并且也会中断。如果仅使用target_link_library,这将不是问题,但是,当然,它们是通过-I包括在内的,并且我再次从该包含中收到编译器警告。

有没有更优雅,更安全的方式来做到这一点?如果target_link_libraries有一个SYSTEM选项告诉cmake将其包含为系统库,那就太好了。

最佳答案

我定义了一个函数来为我处理:

function(target_link_libraries_system target)
  set(libs ${ARGN})
  foreach(lib ${libs})
    get_target_property(lib_include_dirs ${lib} INTERFACE_INCLUDE_DIRECTORIES)
    target_include_directories(${target} SYSTEM PRIVATE ${lib_include_dirs})
    target_link_libraries(${target} ${lib})
  endforeach(lib)
endfunction(target_link_libraries_system)

我现在可以调用target_link_libraries_system(myapp lib::lib),并且从目标的属性中读取包含目录。
可以扩展为可选地指定PUBLIC|PRIVATE|INTERFACE范围:
function(target_link_libraries_system target)
  set(options PRIVATE PUBLIC INTERFACE)
  cmake_parse_arguments(TLLS "${options}" "" "" ${ARGN})
  foreach(op ${options})
    if(TLLS_${op})
      set(scope ${op})
    endif()
  endforeach(op)
  set(libs ${TLLS_UNPARSED_ARGUMENTS})

  foreach(lib ${libs})
    get_target_property(lib_include_dirs ${lib} INTERFACE_INCLUDE_DIRECTORIES)
    if(lib_include_dirs)
      if(scope)
        target_include_directories(${target} SYSTEM ${scope} ${lib_include_dirs})
      else()
        target_include_directories(${target} SYSTEM PRIVATE ${lib_include_dirs})
      endif()
    else()
      message("Warning: ${lib} doesn't set INTERFACE_INCLUDE_DIRECTORIES. No include_directories set.")
    endif()
    if(scope)
      target_link_libraries(${target} ${scope} ${lib})
    else()
      target_link_libraries(${target} ${lib})
    endif()
  endforeach()
endfunction(target_link_libraries_system)

如果库未设置其INTERFACE_INCLUDE_DIRECTORIES属性,则此扩展版本还将打印警告。

关于cmake - CMake:target_link_libraries包含为SYSTEM,以禁止编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52135983/

相关文章:

配置:错误:安装或配置 — C 编译器无法创建可执行文件

CMake;第386章 :x86-64 architecture of input file (. ) 与 i386 输出不兼容

Android CMake "fatal error: ' 位/libc-header-start.h' 找不到文件”

c++ - cmake - 从函数而不是全局范围调用 find_package 时出现奇怪的副作用

c++ - 包含 line_descriptor.hpp,但 KeyLine 和 BinaryDescriptor 仍未定义

cmake - 为目标生成程序集

c++ - 使用 CMake 链接到 cocoa 库(C++ 与 Objective-C 混合)

c++ - 构建 CMake 时使用非默认 libstdc++?

构建 Qpid 时的 RUBY_LIBRARY cmake 变量

cmake - 如何使用CMake显示文件下载进度?