1. 程式人生 > 其它 >CMake 新增標頭檔案搜尋路徑 include_directories, target_include_directories

CMake 新增標頭檔案搜尋路徑 include_directories, target_include_directories

目錄

include_directories

將指定目錄新增到編譯器的標頭檔案搜尋路徑之下,指定的目錄被解釋成當前原始碼路徑的相對路徑。
語法格式:

include_directories ([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

預設情況下,include_directories命令會將目錄新增到列表最後(AFTER選項)。不過,可以通過命令設定CMAKE_INCLUDE_DIRECTORIES_BEFORE 變數為ON來改變它的預設行為,將目錄新增到列表前面。也可以在每次呼叫include_directories命令時使用AFTER或BEFORE選項來指定是新增到列表的前面或者後面。如果使用SYSTEM選項,會把指定目錄當成系統的搜尋目錄。該命令作用範圍只在當前的CMakeLists.txt。

例如,在Linux下,C編譯器預設搜尋路徑:

/usr/include
/usr/local/include

如果我們專案根目錄下,有個公共標頭檔案目錄include1、include2需要新增到C編譯器的預設搜尋路徑,可以在CMakeLists.txt中新增:

include_directories(include1) # 注意當前CMakeLists.txt和include1相對路徑關係, 此時必須是在同一個目錄下
include_directories(${PROJECT_SOURCE_DIR}/include2) # 通過原始碼根目錄來定位include2

target_include_directories

為指定目標(target)新增搜尋路徑,指定目標是指通過如add_executable(),add_library()這樣的命令生成的,並且決不能是alias target(引用目標,別名目標)。
語法格式:

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

AFTER或BEFORE

可以選擇讓新增的路徑位於搜尋列表的開頭或結尾。預設時,預設是AFTER。

INTERFACE,PUBLIC,PRIVATE

指定接下來的引數item(即路徑)的作用域:

  • INTERFACE target對應的標頭檔案才能使用,會指定target的屬性INTERFACE_INCLUDE_DIRECTORIES
  • PUBLIC target對應標頭檔案和原始檔都能使用,會指定target的屬性INCLUDE_DIRECTORIES 和INTERFACE_INCLUDE_DIRECTORIES
  • PRIVATE target對應原始檔使用,會指定target的屬性INCLUDE_DIRECTORIES

注意:
1)所謂使用是指新增標頭檔案搜尋路徑(item)。
2)target的屬性可以通過set_property()修改。

例如,單獨為目標projectA新增搜尋路徑include1。

target_include_directories(projectA ./include1) # 注意當前CMakeLists.txt與include1路徑的相對位置關係

add_executable(projectA main.cpp)

SYSTEM

如果指定SYSTEM,在一些平臺上,編譯器會將路徑作系統包含目錄路徑,可能對包含的標頭檔案在依賴計算時的警告或者忽略,有一些影響。如果SYSTEM和PUBLIC或INTERFACE同時指定,target的屬性INTERFACE_SYSTEM_INCLUDE_DIRECTORIES將填充指定目錄。

include_directories與target_include_directories區別

include_directories 會為當前CMakeLists.txt的所有目標,以及之後新增的所有子目錄的目標新增標頭檔案搜尋路徑。因此,慎用target_include_directories,因為會影響全域性target。

target_include_directories 只會為指定目標包含標頭檔案搜尋路徑。如果想為不同目標設定不同的搜尋路徑,那麼用target_include_directories更合適。

參考

https://cmake.org/cmake/help/latest/command/target_include_directories.html