CMake編譯目錄包含命令include_directories簡介

本文使用的相關(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()接口

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市觅廓,隨后出現(xiàn)的幾起案子鼻忠,更是在濱河造成了極大的恐慌,老刑警劉巖哪亿,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粥烁,死亡現(xiàn)場離奇詭異,居然都是意外死亡蝇棉,警方通過查閱死者的電腦和手機(jī)讨阻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來篡殷,“玉大人钝吮,你說我怎么就攤上這事“辶桑” “怎么了奇瘦?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長劲弦。 經(jīng)常有香客問我耳标,道長,這世上最難降的妖魔是什么邑跪? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任次坡,我火速辦了婚禮,結(jié)果婚禮上画畅,老公的妹妹穿的比我還像新娘砸琅。我一直安慰自己,他們只是感情好轴踱,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布症脂。 她就那樣靜靜地躺著,像睡著了一般淫僻。 火紅的嫁衣襯著肌膚如雪诱篷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天雳灵,我揣著相機(jī)與錄音兴蒸,去河邊找鬼。 笑死细办,一個胖子當(dāng)著我的面吹牛橙凳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播笑撞,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼岛啸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了茴肥?” 一聲冷哼從身側(cè)響起坚踩,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓤狐,沒想到半個月后瞬铸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體批幌,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年嗓节,在試婚紗的時候發(fā)現(xiàn)自己被綠了荧缘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡拦宣,死狀恐怖截粗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鸵隧,我是刑警寧澤绸罗,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站豆瘫,受9級特大地震影響珊蟀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜外驱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一系洛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧略步,春花似錦描扯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杭煎,卻和暖如春恩够,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背羡铲。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工蜂桶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人也切。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓扑媚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親雷恃。 傳聞我的和親對象是個殘疾皇子疆股,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容