target_include_directories

為目標添加包含目錄。

target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
  <INTERFACE|PUBLIC|PRIVATE> [items1...]
  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

指定編譯給定目標時要使用的包含目錄。指定的 <target> 必須已由諸如 add_executable()add_library() 等命令建立,且不得為 別名目標

透過明確使用 AFTERBEFORE,您可以選擇附加或前置,而與預設值無關。

INTERFACEPUBLICPRIVATE 關鍵字是指定後續引數的 範圍 所必需的。PRIVATEPUBLIC 項目將填充 <target>INCLUDE_DIRECTORIES 屬性。PUBLICINTERFACE 項目將填充 <target>INTERFACE_INCLUDE_DIRECTORIES 屬性。以下引數指定包含目錄。

Added in version 3.11: 允許在 匯入目標 上設定 INTERFACE 項目。

對同一個 <target> 的重複呼叫會按照呼叫順序附加項目。

如果指定了 SYSTEM,編譯器將被告知這些目錄在某些平台上被視為系統包含目錄。這可能會產生一些影響,例如抑制警告或在依賴關係計算中跳過包含的標頭(請參閱編譯器文件)。此外,無論指定的順序如何,都會在常規包含目錄之後搜尋系統包含目錄。

如果 SYSTEMPUBLICINTERFACE 一起使用,則 INTERFACE_SYSTEM_INCLUDE_DIRECTORIES 目標屬性將會填充指定的目錄。

target_include_directories 的引數可以使用生成器表達式,語法為 $<...>。請參閱 cmake-generator-expressions(7) 手冊以取得可用的表達式。請參閱 cmake-buildsystem(7) 手冊以了解更多關於定義建置系統屬性的資訊。

指定的包含目錄可以是絕對路徑或相對路徑。相對路徑將被解釋為相對於當前原始碼目錄(即 CMAKE_CURRENT_SOURCE_DIR),並在儲存到相關的目標屬性之前轉換為絕對路徑。如果路徑以生成器表達式開頭,則始終假定它是絕對路徑(以下註明一個例外),並將不經修改地使用。

包含目錄的使用需求通常在建置樹和安裝樹之間有所不同。BUILD_INTERFACEINSTALL_INTERFACE 生成器表達式可用於描述基於使用位置的不同使用需求。INSTALL_INTERFACE 表達式中允許使用相對路徑,並將其解釋為相對於安裝前綴的相對路徑。相對路徑不應在 BUILD_INTERFACE 表達式中使用,因為它們不會被轉換為絕對路徑。例如

target_include_directories(mylib PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/mylib>
  $<INSTALL_INTERFACE:include/mylib>  # <prefix>/include/mylib
)

建立可重定位的套件

請注意,不建議使用依賴項的包含目錄的絕對路徑來填充目標的 INTERFACE_INCLUDE_DIRECTORIESINSTALL_INTERFACE。這會將依賴項的包含目錄路徑硬編碼到已安裝的套件中,如同在建立套件的機器上找到的路徑

INTERFACE_INCLUDE_DIRECTORIESINSTALL_INTERFACE 僅適用於指定目標本身提供的標頭所需的包含目錄,而不適用於其 INTERFACE_LINK_LIBRARIES 目標屬性中列出的傳遞依賴項提供的標頭。這些依賴項本身應該是目標,這些目標在其 INTERFACE_INCLUDE_DIRECTORIES 中指定了自己的標頭位置。

有關在建立用於重新發布的套件時,指定使用需求時必須格外注意的討論,請參閱 cmake-packages(7) 手冊的 建立可重定位的套件 章節。

參見