根據網上的資料,我總結了一下,一個工程應該有根目錄(bin)存放可執行文件,頭文件目錄(include)存放頭文件,源碼文件(src)存放你的算法,還需要一個庫文件夾存放你編譯的靜態庫或者動態庫。然后得出下面這個例子:
工程文件目錄創建
/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.c
#include "/home/bmi-zc/project/include/test.h"
#include <stdio.h>
void t1()
{
printf("this is t1()\n");
}
test2.c
#include "/home/bmi-zc/project/include/test.h"
#include <stdio.h>
void t2()
{
printf("this is t2()\n");
}
main.c:
#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:
cmake_minimum_required(VERSION 3.5)
PROJECT(TEST)
ADD_SUBDIRECTORY(src)
CMakeLists.txt內容:指定項目名稱,添加工程源碼子目錄(子目錄里面還有目錄,只需要把源碼根目錄添加進去就行,例如上圖,只需要添加src目錄ADD_SUBDIRECTORY(src)
即可)。
用到的指令:PROJECT,ADD_SUBDIRECTORY。
- 指定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/
ADD_SUBDIRECTORY(main)
ADD_SUBDIRECTORY(test)
CMakeLists.txt內容:添加源碼子目錄
所用到指令:ADD_SUBDIRECTORY
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
分享推送
- 常用命令詳情請參考對應CMake版本
- 比較好的3篇關於Cmake的博文:
1 . 關於cmake的使用總結,發布於2013年11月。
https://www.mawenbao.com/note/cmake.html
2 . 關於cmake入門實戰,發布於2013年12月。
http://hahack.com/codes/cmake/
3 . 關於cmake的命令和一下命令例子,發布於2014年11月
http://blog.csdn.net/wzzfeitian/article/details/40963457/