ubuntu16.04下Cmake學習一

根據網上的資料,我總結了一下,一個工程應該有根目錄(bin)存放可執行文件,頭文件目錄(include)存放頭文件,源碼文件(src)存放你的算法,還須要一個庫文件夾存放你編譯的靜態庫或者動態庫。而後得出下面這個例子:html

工程文件目錄建立

/home/bmi-zc/project:
|—CMakeLists.txt 頂層CMakeLists
|
|—bin
|
|—include
|    test.h    
|
|—lib
|
|—src
  |  CMakeLists.txt
  |  
  |—main
  |  CMakeLists.txt
  |  main.c
  |
  |—test
    CMakeLists.txt
    test1.c
    test2.c  算法

程序清單

test.h編輯器

#ifndef INCLUDE_TEST_H
    #define INCLUDE_TEST_H
    void t1();
    void t2();
    #endif /*INCLUDE_TEST_H*/

test1.cui

#include "/home/bmi-zc/project/include/test.h"
    #include <stdio.h>
    void t1()
    {
    printf("this is t1()\n");   
    }

test2.cthis

#include "/home/bmi-zc/project/include/test.h"
    #include <stdio.h>
    void t2()
    {
    printf("this is t2()\n");
    }

main.c:.net

#include "/home/bmi-zc/project/include/test.h"  
    int main()  
    {  
    t1();  
    t2();  
    return 0;  
    }

多目錄多文件CMakeLists.txt

1 . 頂層CMakeLists.txt

/home/bmi-zc/project/CMakeLists.txt:3d

cmake_minimum_required(VERSION 3.5)
    PROJECT(TEST)
    ADD_SUBDIRECTORY(src)

CMakeLists.txt內容:指定項目名稱,添加工程源碼子目錄(子目錄裏面還有目錄,只須要把源碼根目錄添加進去就行,例如上圖,只須要添加src目錄ADD_SUBDIRECTORY(src)便可)。
用到的指令:PROJECT,ADD_SUBDIRECTORY。code

  • 指定CMake的最低版本
    cmake_minimum_required(VERSION 3.5)
    不添加這一句並不影響整個cmake的過程,可是cmake會建議你加上這一句。
  • project命令
    project(項目名稱)
    例子:PROJECT(TEST)
    系統預約義變量PROJECT_SOURCE_DIR和PROJECT_BINARY_DIR。
    PROJECT_SOURCE就是項目的根目錄,例如;頭文件include目錄路徑能夠表示爲:
    ${PROJECT_SOURCE_DIR}/include ,其中PROJECT是能夠換爲項目名稱TEST的。建議使用PROJECT_SOURCE_DIR。
    若使用「項目名稱「_SOURCE_DIR,一旦項目名稱更改,全部對應的名稱也要更改。
  • ADD_SUBDIRECTORY命令
    ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
    例子:ADD_SUBDIRECTORY(src bin)
    這個指令用於向當前工程添加存放源文件目錄下的子目錄(源碼存放在src目錄,須要本身提早建立src,並把源碼放進去),並能夠指定中間二進制和目標二進制存放的位置(bin目錄,系統本身會建立)。
    EXCLUDE_FROM_ALL 參數的含義是將這個目錄從編譯過程當中排除。好比,工程的 example,可能就須要工程構建完成後,再進入 example 目錄單獨進行構建。

2. 源碼目錄下頂層CMakeLists.txt

/home/bmi-zc/project/src/htm

ADD_SUBDIRECTORY(main)
    ADD_SUBDIRECTORY(test)

CMakeLists.txt內容:添加源碼子目錄
所用到指令:ADD_SUBDIRECTORYblog

3. 源碼子目錄(算法目錄)CMakeLists.txt

/home/bmi-zc/project/src/test/

SET(CMAKE_C_COMPTLER GCC)
    SET(SRC_LIST test1.c test2.c)
    INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
    SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
    ADD_LIBRARY(libtest STATIC ${SRC_LIST})

CMakeLists.txt內容:設置編輯器,添加頭文件路徑,設置lib輸出目錄,生成靜態連接庫

  • SET命令
    SET(CMAKE_INSTALL_PREFIX /usr/local)
    指令含義(相似宏定義):路徑/usr/local用CMAKE_INSTALL_PREFIX來代替
    SET(VAR[VALUE][CACHE TYPE DOCSTRING[FORCE]])指令,將全部文件組合成一股列表清單,例如:SET(SRC_LIST main.c test.c p.c)。
    SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)把靜態連接庫的結果生成到/home/bmi-zc/peoject/lib中
  • INCLUDE_DIRECTORIES
    例子:INCLUDE_DIRECTORIES( ../include)
    INCLUDE_DIRECTORIES相似gcc中的編譯參數「-I」,指定編譯過程當中編譯器搜索頭文件的路徑。當項目須要的頭文件不在系統默認的搜索路徑時,須要指定該路徑。在咱們的項目中,test1,test2所需的頭文件都存放在${TEST_SOURCE_DIR}/include下。
  • ADD_LIBRARY
    ADD_LIBRARY(libname [SHARED | STATIC | MODULE] [EXCLUDE_FROM_ALL] SRC_LIST)
    生成靜態連接庫或動態庫
    例子:ADD_LIBRARY(libtest STATIC ${SRC_LIST})

/home/bmi-zc/project/src/main

SET(SRC_LIST main.c)
    INCLUDE_DIRECTORIES(${TEST_SOURCE_DIR}/include)
    SET(EXECUTABLE_OUTPUT_PATH ${TEST_SOURCE_DIR}/bin)
    ADD_EXECUTABLE(main ${SRC_LIST})
    link_directories(${TEST_SOURCE_DIR}/lib)
    TARGET_LINK_LIBRARIES(main libtest)

CMakeLists.txt內容:整理代碼清單,頭文件目錄,可執行文件輸出路徑,靜態庫連接路徑,連接靜態庫。

  • ADD_EXECUTABLE
    生成可執行文件,ADD_EXECUTABLE(main ${SRC_LIST}),執行文件名字叫main。SRC_LIST爲編譯清單。
  • link_directories
    添加靜態連接庫路徑,${TEST_SOURCE_DIR}/lib爲路徑等同於/home/bmi-zc/project/lib。
  • TARGET_LINK_LIBRARIES
    將靜態庫添加到可執行文件中,
    TARGET_LINK_LIBRARIES(main libtest),main爲可執行文件,libtest爲靜態庫的名字,注意要和以前建立的靜態庫名字同樣。

編譯

  • 回到工程根目錄,/home/bmi-zc/project
    cmake .
    make

  • 進入bin文件夾,執行main可執行文件
    cd bin
    ./main

分享推送

相關文章
相關標籤/搜索