簡體   English   中英

在CMake中如何使`TARGET_LINK_LIBRARIES'禁止第三方庫代碼發出警告?

[英]In CMake how do I make `TARGET_LINK_LIBRARIES` suppress warnings from 3rd party library code?

在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 ,這樣可以有效地關閉警告,而不會影響項目的剩余部分。

我有一個類似的問題 ,我用自定義函數解決了這個問題:

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范圍,但由於我在可執行文件上使用它,現在就足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM