代码之家  ›  专栏  ›  技术社区  ›  frans

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

  •  2
  • frans  · 技术社区  · 7 年前

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

    TARGET_INCLUDE_DIRECTORIES(mytarget
        SYSTEM
            ${3rdPartyLib_INCLUDE_DIR})
    

    我更喜欢用 TARGET_LINK_LIBRARIES 这也使得第三方库中的include目录可用。 据我所知, 目标链接库 不支持 SYSTEM 修改器,将这些目录添加为系统包含目录。

    我做错什么了吗?

    有没有办法做到:

    TARGET_LINK_LIBRARIES(mytarget
        ${3rdPartyLib_INCLUDE_DIR})
    

    使用 -isystem ? (或以任何其他方式抑制来自 3rdPartyLib ).

    2 回复  |  直到 7 年前
        1
  •  4
  •   sebastian    7 年前

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

        2
  •  -2
  •   J-Christophe    7 年前

    我建议您创建一个名为 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_PUSH , CLANG_PRAGMA_POP , GCC_PRAGMA_PUSH , GCC_PRAGMA_POP , ...

    有关此类宏的示例,请参见 https://github.com/InsightSoftwareConsortium/ITK/blob/6b41fe1cbf7a71a6003d4824e02a69b41a508cda/Modules/Core/Common/include/itkMacro.h#L69-L136

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