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
屬性。以下引數指定包含目錄。
在 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)
手冊的建立可重定位的套件章節,以了解關於在建立用於重新散佈的套件時指定使用需求時,必須額外注意的事項。