在CMake中,您可以使TARGET_INCLUDE_DIRECTORIES() add include目录作为系统包含目录(即使用-isystem),以免弹出以其第三方代码为根的警告:

TARGET_INCLUDE_DIRECTORIES(mytarget
    SYSTEM
        ${3rdPartyLib_INCLUDE_DIR})

我更喜欢使用TARGET_LINK_LIBRARIES,这也使来自第三方库的包含目录可用。
据我所知,TARGET_LINK_LIBRARIES不支持SYSTEM修饰符将这些目录添加为系统包含目录。

我做错什么了吗?

有没有办法使:
TARGET_LINK_LIBRARIES(mytarget
    ${3rdPartyLib_INCLUDE_DIR})

使用-isystem吗? (或其他任何抑制3rdPartyLib的警告的方式)。

最佳答案

我有一个similar question,我用一个自定义函数解决了这个问题:

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范围,但是由于我在可执行文件上使用了它,所以现在就足够了。

09-07 07:28