target_include_directories¶
為目標添加包含目錄。
target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
指定編譯給定目標時要使用的包含目錄。指定的 <target>
必須已由諸如 add_executable()
或 add_library()
等命令建立,且不得為 別名目標。
透過明確使用 AFTER
或 BEFORE
,您可以選擇附加或前置,而與預設值無關。
INTERFACE
、PUBLIC
和 PRIVATE
關鍵字是指定後續引數的 範圍 所必需的。PRIVATE
和 PUBLIC
項目將填充 <target>
的 INCLUDE_DIRECTORIES
屬性。PUBLIC
和 INTERFACE
項目將填充 <target>
的 INTERFACE_INCLUDE_DIRECTORIES
屬性。以下引數指定包含目錄。
Added in version 3.11: 允許在 匯入目標 上設定 INTERFACE
項目。
對同一個 <target>
的重複呼叫會按照呼叫順序附加項目。
如果指定了 SYSTEM
,編譯器將被告知這些目錄在某些平台上被視為系統包含目錄。這可能會產生一些影響,例如抑制警告或在依賴關係計算中跳過包含的標頭(請參閱編譯器文件)。此外,無論指定的順序如何,都會在常規包含目錄之後搜尋系統包含目錄。
如果 SYSTEM
與 PUBLIC
或 INTERFACE
一起使用,則 INTERFACE_SYSTEM_INCLUDE_DIRECTORIES
目標屬性將會填充指定的目錄。
target_include_directories
的引數可以使用生成器表達式,語法為 $<...>
。請參閱 cmake-generator-expressions(7)
手冊以取得可用的表達式。請參閱 cmake-buildsystem(7)
手冊以了解更多關於定義建置系統屬性的資訊。
指定的包含目錄可以是絕對路徑或相對路徑。相對路徑將被解釋為相對於當前原始碼目錄(即 CMAKE_CURRENT_SOURCE_DIR
),並在儲存到相關的目標屬性之前轉換為絕對路徑。如果路徑以生成器表達式開頭,則始終假定它是絕對路徑(以下註明一個例外),並將不經修改地使用。
包含目錄的使用需求通常在建置樹和安裝樹之間有所不同。BUILD_INTERFACE
和 INSTALL_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_DIRECTORIES
的 INSTALL_INTERFACE
。這會將依賴項的包含目錄路徑硬編碼到已安裝的套件中,如同在建立套件的機器上找到的路徑。
INTERFACE_INCLUDE_DIRECTORIES
的 INSTALL_INTERFACE
僅適用於指定目標本身提供的標頭所需的包含目錄,而不適用於其 INTERFACE_LINK_LIBRARIES
目標屬性中列出的傳遞依賴項提供的標頭。這些依賴項本身應該是目標,這些目標在其 INTERFACE_INCLUDE_DIRECTORIES
中指定了自己的標頭位置。
有關在建立用於重新發布的套件時,指定使用需求時必須格外注意的討論,請參閱 cmake-packages(7)
手冊的 建立可重定位的套件 章節。