在CMake中,如何使用`TARGET_LINK_LIBRARIES`来抑制第三方库代码的警告?

11
在CMake中,您可以使用TARGET_INCLUDE_DIRECTORIES()函数将包含目录添加为系统包含目录(即使用-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警告的方法。)


是的,请创建一个伪目标来模拟导入库及其依赖项。然后将该目标与target_link_libraries关联起来。 例如,请参阅findboost.cmake脚本,并注意boost库如何由诸如Boost :: boost、Boost :: system等目标表示。 https://github.com/Kitware/CMake/blob/master/Modules/FindBoost.cmake - Richard Hodges
与其抑制第三方库的警告,实现某种门面库隔离它们会是一个更好的主意。 - user7860670
在某些情况下,这可能是一个选项,但如果您需要为Boost和/或Qt创建门面,则不是这种情况 - 对于小型程序,这将占大约95%的样板门面代码和5%的自有代码。在这种情况下,我宁愿声明TARGET_LINK_LIBRARIES()不完整,而使用TARGET_INCLUDE_DIRECTORIES - frans
target_link_libraries 链接到库目标。将包含目录传递给它是没有意义的。 - starball
2个回答

6

我曾经有一个类似的问题,我用自定义函数解决了它:

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范围,但由于我将其用于可执行文件,目前这已经足够了。


注意:这将无法与生成的属性一起使用。为此,您需要执行target_include_directories(${target} SYSTEM PRIVATE "$<BUILD_INTERFACE:$<TARGET_PROPERTY:${lib},INTERFACE_INCLUDE_DIRECTORIES>>"),因为这些属性在“cmake时间”不可用。您可能想将BUILD_INTERFACE更改为其他内容,请参见链接。 - ARentalTV

-3
我建议您创建一个名为myproject_thirdparty.h的头文件,其内容如下:
#ifndef myproject_thirdparty_h
#define myproject_thirdparty_h

#include "myprojectMacros.h"

CLANG_PRAGMA_PUSH
CLANG_SUPPRESS_Wfloat_equal
CLANG_PRAGMA_POP

#endif

myprojectMacros.h 中定义有用的宏,例如 CLANG_PRAGMA_PUSHCLANG_PRAGMA_POPGCC_PRAGMA_PUSHGCC_PRAGMA_POP 等。

例如这样的宏,请参见 https://github.com/InsightSoftwareConsortium/ITK/blob/6b41fe1cbf7a71a6003d4824e02a69b41a508cda/Modules/Core/Common/include/itkMacro.h#L69-L136

然后,在您的项目代码中,每次想要使用库时,都需要包含 myproject_thirdparty_h,这将有效地关闭警告,而不会影响您项目的其余部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接