在CMake中如何使`TARGET_LINK_LIBRARIES'禁止第三方库代码发出警告?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在CMake中如何使`TARGET_LINK_LIBRARIES'禁止第三方库代码发出警告?相关的知识,希望对你有一定的参考价值。

在CMake中,您可以将TARGET_INCLUDE_DIRECTORIES()添加包含目录作为系统包含目录(即使用-isystem),以便不会弹出以第3方代码为根的警告:

TARGET_INCLUDE_DIRECTORIES(mytarget
    SYSTEM
        ${3rdPartyLib_INCLUDE_DIR})

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

我弄错了吗?

有没有办法:

TARGET_LINK_LIBRARIES(mytarget
    ${3rdPartyLib_INCLUDE_DIR})

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

答案

我建议你创建一个名为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,这将有效地关闭警告而不会影响项目的剩余部分。

另一答案

我有一个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),并从目标的属性中读取include目录。

现在可以将其扩展为指定PUBLIC|PRIVATE|INTERFACE范围,但由于我在可执行文件上使用它,现在就足够了。

以上是关于在CMake中如何使`TARGET_LINK_LIBRARIES'禁止第三方库代码发出警告?的主要内容,如果未能解决你的问题,请参考以下文章

在CMake中如何使`TARGET_LINK_LIBRARIES'禁止第三方库代码发出警告?

如何在构建之前使CMake运行python脚本,以便为我的项目生成文件以在构建中使用?

如何使 cmake 将 D 参数传递给 ar 以可重现地构建静态库

使用 CMake 构建时如何使 QtCreator 识别 OpenGL 函数的自动完成功能?

如何在CMake中配置可移植并行版本?

如何使 CLion 在 .cpp 文件中插入生成的代码....