本文使用的相關(guān)軟件環(huán)境信息如下:
軟件名稱 | 軟件版本 |
---|---|
Linux操作系統(tǒng) | Ubuntu 22.04 LTS(X64) |
cmake | 3.22.1 |
-
include_directories
命令格式:
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
該命令主要是將目錄添加到編譯器的頭文件的搜索目錄之下蹬挤,具體介紹見這里。執(zhí)行該命令后跌宛,會將指定的目錄添加到當(dāng)前CMakeLists.txt文件的INCLUDE_DIRECTORIES目錄屬性和INCLUDE_DIRECTORIES目標(biāo)文件屬性中描沟。接下來看一個實(shí)例囱嫩,看include_directories添加目錄之后飒筑,INCLUDE_DIRECTORIES屬性內(nèi)容的變化识窿。目錄結(jié)構(gòu)如下礼预,后續(xù)沒有特殊說明超营,執(zhí)行命令的目錄為include_directories:
include_directories/ ├── CMakeLists.txt ├── main.cpp ├── testdir1 │ ├── CMakeLists.txt │ ├── test1.cpp │ └── test1.h │ └── testdir1_subdir └── testdir2 ├── CMakeLists.txt ├── test2.cpp └── test2.hs
include_directories/CMakeLists.txt內(nèi)容如下:
cmake_minimum_required(VERSION 3.22) project(dir_test) include_directories(testdir1) message("--$ include_directories: testdir1") # 獲取當(dāng)前文件的INCLUDE_DIRECTORIES目錄屬性 get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) message("--$ in directory: ${CMAKE_CURRENT_SOURCE_DIR}, include dir list: ${dirs}") # 編譯testdir1下的庫 add_subdirectory(testdir1) message("--$ after compile lib test1") get_property(dirs TARGET test1 PROPERTY INCLUDE_DIRECTORIES) message("--$ lib test1 include dir list: ${dirs}") get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) message("--$ current file include dir list: ${dirs}") # 編譯testdir2下的庫 add_subdirectory(testdir2) message("--$ after compile lib test2") get_property(dirs TARGET test1 PROPERTY INCLUDE_DIRECTORIES) message("--$ lib test1 include dir list: ${dirs}") get_property(dirs TARGET test2 PROPERTY INCLUDE_DIRECTORIES) message("--$ lib test2 include dir list: ${dirs}") get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) message("--$ current file include dir list: ${dirs}") add_executable(main main.cpp) message("--$ after add exe main") get_property(dirs TARGET test1 PROPERTY INCLUDE_DIRECTORIES) message("--$ lib test1 include dir list: ${dirs}") get_property(dirs TARGET test2 PROPERTY INCLUDE_DIRECTORIES) message("--$ lib test2 include dir list: ${dirs}") get_property(dirs TARGET main PROPERTY INCLUDE_DIRECTORIES) message("--$ executable main include dir list: ${dirs}") get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) message("--$ current file include dir list: ${dirs}") message("---") target_link_libraries(main test1) message("--$ after add lib test1") get_property(dirs TARGET test1 PROPERTY INCLUDE_DIRECTORIES) message("--$ lib test1 include dir list: ${dirs}") get_property(dirs TARGET test2 PROPERTY INCLUDE_DIRECTORIES) message("--$ lib test2 include dir list: ${dirs}") get_property(dirs TARGET main PROPERTY INCLUDE_DIRECTORIES) message("--$ executable main include dir list: ${dirs}") get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) message("--$ current file include dir list: ${dirs}") message("---") target_link_libraries(main test2) message("--$ after add lib test2") get_property(dirs TARGET test1 PROPERTY INCLUDE_DIRECTORIES) message("--$ lib test1 include dir list: ${dirs}") get_property(dirs TARGET test2 PROPERTY INCLUDE_DIRECTORIES) message("--$ lib test2 include dir list: ${dirs}") get_property(dirs TARGET main PROPERTY INCLUDE_DIRECTORIES) message("--$ executable main include dir list: ${dirs}") get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) message("--$ current file include dir list: ${dirs}") message("---") include_directories(testdir2) message("--$ include_directories: testdir2") get_property(dirs TARGET test1 PROPERTY INCLUDE_DIRECTORIES) message("--$ lib test1 include dir list: ${dirs}") get_property(dirs TARGET test2 PROPERTY INCLUDE_DIRECTORIES) message("--$ lib test2 include dir list: ${dirs}") get_property(dirs TARGET main PROPERTY INCLUDE_DIRECTORIES) message("--$ executable main include dir list: ${dirs}") get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) message("--$ current file include dir list: ${dirs}") message("---")
include_directories/main.cpp內(nèi)容:
#include "test1.h" #include "test2.h" int main(int argc, char** argv) { test1_print(); test2_print(); }
include_directories/testdir1/CMakeLists.txt內(nèi)容如下:
message("---") message("---Enter directory: ${CMAKE_CURRENT_SOURCE_DIR}") include_directories(testdir1_subdir) # 獲取當(dāng)前文件的INCLUDE_DIRECTORIES目錄屬性 get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) message(" --$ include dir list: ${dirs}") add_library(test1 test1.cpp) message(" --$ after add lib test1") get_property(dirs TARGET test1 PROPERTY INCLUDE_DIRECTORIES) message(" --$ lib test1 include dir list: ${dirs}") get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) message(" --$ current file include dir list: ${dirs}") message("---Exist directory: ${CMAKE_CURRENT_SOURCE_DIR}") message("---")
include_directories/testdir1/test1.cpp和include_directories/testdir1/test1.h文件內(nèi)容如下:
// test1.h #ifndef __TEST1_T__ #define __TEST1_T__ void test1_print(); #endif // test1.cpp #include "test1.h" #include <iostream> void test1_print() { std::cout << "From test1: hello!" << std::endl; }
include_directories/testdir2/CMakeLists.txt內(nèi)容如下:
message("---") message("---Enter directory: ${CMAKE_CURRENT_SOURCE_DIR}") # 獲取當(dāng)前文件的INCLUDE_DIRECTORIES目錄屬性 get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) message(" --$ include dir list: ${dirs}") add_library(test2 test2.cpp) message(" --$ after add lib test2") get_property(dirs TARGET test2 PROPERTY INCLUDE_DIRECTORIES) message(" --$ lib test2 include dir list: ${dirs}") get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) message(" --$ current file include dir list: ${dirs}") message("---Exist directory: ${CMAKE_CURRENT_SOURCE_DIR}") message("---")
include_directories/testdir2/test2.cpp和include_directories/testdir2/test2.h文件內(nèi)容如下:
// test2.h #ifndef __TEST2_T__ #define __TEST2_T__ void test2_print(); #endif // test2.cpp #include "test2.h" #include <iostream> void test2_print() { std::cout << "From test2: hello!" << std::endl; }
運(yùn)行
cmake .
腺办、make
以及./main
等命令,關(guān)鍵輸出如下:$cmake . …… --$ include_directories: testdir1 --$ in directory: /XXX/include_directories, include dir list: /XXX/include_directories/testdir1 --- ---Enter directory: /XXX/include_directories/testdir1 --$ include dir list: /XXX/include_directories/testdir1;/XXX/include_directories/testdir1/testdir1_subdir --$ after add lib test1 --$ lib test1 include dir list: /XXX/include_directories/testdir1;/XXX/include_directories/testdir1/testdir1_subdir --$ current file include dir list: /XXX/include_directories/testdir1;/XXX/include_directories/testdir1/testdir1_subdir ---Exist directory: /XXX/include_directories/testdir1 --- --$ after compile lib test1 --$ lib test1 include dir list: /XXX/include_directories/testdir1;/XXX/include_directories/testdir1/testdir1_subdir --$ current file include dir list: /XXX/include_directories/testdir1 --- ---Enter directory: /XXX/include_directories/testdir2 --$ include dir list: /XXX/include_directories/testdir1 --$ after add lib test2 --$ lib test2 include dir list: /XXX/include_directories/testdir1 --$ current file include dir list: /XXX/include_directories/testdir1 ---Exist directory: /XXX/include_directories/testdir2 --- --$ after compile lib test2 --$ lib test1 include dir list: /XXX/include_directories/testdir1;/XXX/include_directories/testdir1/testdir1_subdir --$ lib test2 include dir list: /XXX/include_directories/testdir1 --$ current file include dir list: /XXX/include_directories/testdir1 --$ after add exe main --$ lib test1 include dir list: /XXX/include_directories/testdir1;/XXX/include_directories/testdir1/testdir1_subdir --$ lib test2 include dir list: /XXX/include_directories/testdir1 --$ executable main include dir list: /XXX/include_directories/testdir1 --$ current file include dir list: /XXX/include_directories/testdir1 --- --$ after add lib test1 --$ lib test1 include dir list: /XXX/include_directories/testdir1;/XXX/include_directories/testdir1/testdir1_subdir --$ lib test2 include dir list: /XXX/include_directories/testdir1 --$ executable main include dir list: /XXX/include_directories/testdir1 --$ current file include dir list: /XXX/include_directories/testdir1 --- --$ after add lib test2 --$ lib test1 include dir list: /XXX/include_directories/testdir1;/XXX/include_directories/testdir1/testdir1_subdir --$ lib test2 include dir list: /XXX/include_directories/testdir1 --$ executable main include dir list: /XXX/include_directories/testdir1 --$ current file include dir list: /XXX/include_directories/testdir1 --- --$ include_directories: testdir2 --$ lib test1 include dir list: /XXX/include_directories/testdir1;/XXX/include_directories/testdir1/testdir1_subdir --$ lib test2 include dir list: /XXX/include_directories/testdir1 --$ executable main include dir list: /XXX/include_directories/testdir1;/XXX/include_directories/testdir2 --$ current file include dir list: /XXX/include_directories/testdir1;/XXX/include_directories/testdir2 --- -- Configuring done -- Generating done -- Build files have been written to: /XXX/include_directories $ make Consolidate compiler generated dependencies of target test2 [ 16%] Building CXX object testdir2/CMakeFiles/test2.dir/test2.cpp.o [ 33%] Linking CXX static library libtest2.a [ 33%] Built target test2 Consolidate compiler generated dependencies of target test1 [ 66%] Built target test1 Consolidate compiler generated dependencies of target main [ 83%] Building CXX object CMakeFiles/main.dir/main.cpp.o [100%] Linking CXX executable main [100%] Built target main $ ./main From test1: hello! From test2: hello!
以上結(jié)果表明了幾點(diǎn):
1糟描、include_directories添加的目錄怀喉,會自動添加到當(dāng)前所在的CMakeLists.txt文件的INCLUDE_DIRECTORIES目錄屬性,以及在當(dāng)前CMakeLists.txt文件中定義的目標(biāo)(通過add_executable/add_library等添加的目標(biāo))屬性INCLUDE_DIRECTORIES中船响。
2躬拢、include_directories添加的目錄,會傳遞到當(dāng)前所在CMakeLists.txt文件中通過add_subdirectory增加的下層CMakeLists.txt中(add_subdirectory語句之后調(diào)用的include_directories添加的目錄無法傳遞)见间。
3聊闯、下層CMakeLists.txt文件中調(diào)用的include_directories添加的目錄,不會傳遞到調(diào)用它的上層CMakeLists.txt文件米诉。
4菱蔬、上層CMakeLists.txt中的include_directories與add_subdirectory相對位置對子CMakeLists.txt中能看到的目錄有影響。
對我們的例子來說:
1史侣、可執(zhí)行文件main能看到目錄:testdir1拴泌、testdir2
2、庫文件test1能看到目錄:testdir1惊橱、testdir1_subdir蚪腐,無法看到testdir2,是因?yàn)檎{(diào)用add_subdirectory添加子目錄testdir1時税朴,還未通過include_directories包含testdir2
3回季、庫文件test2能看到目錄:testdir1,沒錯正林!這意味對于本文的例子來說泡一,test2.cpp可以直接包含test1.h文件并調(diào)用test1_print()接口