文章目錄
- 一、CMake簡介
- 二、CMake的安裝
- 三、CMake的語法特性的介紹
- 基本語法格式
- CMake常用的指令和變數
- 1. 常用的指令
- 2.常用的變數
- 四、CMake編譯工程
- 1.目錄結構
- 2. 編譯流程
- 3. 兩種構建方式
- 五、一個簡單工程的構建
- 1.目錄結構
- 2.CMakeLists.txt
- 3.程序
- 六、靜態庫和動態庫的編譯控制
一、CMake簡介
??CMake是一個跨平臺的安裝(編譯)工具,可以用簡單的陳述句來描述所有平臺的安裝(編譯程序),他能夠輸出各種各樣的makefile或者project檔案,
特點:使用簡單方便,可以跨平臺使用,構建專案編譯環境,比直接寫Makefile檔案簡單,可以通過簡單的CMake生成復雜的Makefile檔案,
關于跨平臺
Let’s assume you have some cross-platform project with C++ code shared along different platforms/IDE.Say you use visual studio on Windows,xcode on Mac and Makefile for Linux:

如果這時候我們工程中增加了一個bar.cpp檔案,我們要對Makefile等三個檔案進行修改,這就比較麻煩,

所以當我們使用CMake的時候,我們要先寫一個CMake的組態檔CMakeLists.txt,執行cmake .之后在不同的平臺就會自動的生成不同的工程檔案,在Linux平臺生成Makefile檔案,這就減少了我們的作業量,

這時候如果我們添加了一個bar.cpp檔案,只需要修改CMakeLists.txt就可以了,
二、CMake的安裝
Ubuntu上直接執行sudo apt install cmake,通過cmake -version查看版本,
jqw@jqw-virtual-machine:~/my_code/test6_10$ cmake -version
cmake version 3.16.3
CMake suite maintained and supported by Kitware (kitware.com/cmake).
三、CMake的語法特性的介紹
基本語法格式
????指令(引數1 引數2…)
-
引數之間用
空格或者分號隔開(不要使用逗號) -
指令不區分大小寫,引數和變數是區分大小寫的 -
變數使用${}方式取值,但是在 IF 控制陳述句中是直接使用變數名

CMake常用的指令和變數
1. 常用的指令
[ ] 代表可選項
(1)cmake_minimum_required :指定CMake的最小版本要求
- 語法:cmake_minimum_required(VERSION versionNumber [FATAL_ERROR])
# CMake最小版本要求為2.8.3
cmake_minimum_required(VERSION 2.8.3)
(2)project :自定義工程名稱,并可以指定工程支持的語言
- 語法:project(projectname [CXX] [C] [Java])
# CMake指定工程名為HELLOWORLD
project(HELLOWORLD)
(3)set : 顯式的定義變數
- 語法:set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
# Cmake - 定義SRC變數,其值為max.cpp sum.cpp
set(SRC max.cpp sum.cpp)
(4)add_executable:生成可執行檔案
- 語法:add_executable (exename source1 source2 … source n)
# c 編譯main.cpp,sum.c max.c生成可執行檔案main
add_executable(main main.c sum.c max.c)
# same : g++ -o main main.c sum.c max.c
(5)include_directories: 向工程添加多個特定的頭檔案搜索路徑 ,相當于指定g++編譯器的-I引數,也相當于我們配置VScode時的includepath,
- 語法:include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)
# 將/usr/include/myincludefolder 和 ./include 添加到頭檔案搜索路徑
include_directories(/usr/include/myincludefolder ./include)
(6)link_directories:向工程添加多個特定的庫檔案搜索路徑 —>相當于指定g++編譯器的-L引數,
- 語法:link_directories(dir1 dir2 …)
# 將/usr/lib/mylibfolder 和 ./lib 添加到庫檔案搜索路徑
link_directories(/usr/lib/mylibfolder ./lib)
(7)add_library: 生成庫檔案
- 語法:add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)
# 通過變數 SRC 生成 libhello.so 共享庫
add_library(hello SHARED ${SRC})
(8)add_compile_options :添加編譯引數
# 添加編譯引數 -Wall -std=c++11
add_compile_options(-Wall -std=c++11 -O2)
(9)target_link_libraries: 為 target 添加需要鏈接的共享庫 —>相同于指定g++編譯器-l引數
- 語法:target_link_libraries(target library1library2…)
# 將hello動態庫檔案鏈接到可執行檔案main
target_link_libraries(main hello)
(10)aux_source_directory : 發現一個目錄下所有的源代碼檔案并將串列存盤在一個變數中,這個指令臨時被用來自動構建源檔案串列
- 語法:aux_source_directory(dir VARIABLE)
# 定義SRC變數,其值為當前目錄下所有的源代碼檔案
aux_source_directory(. SRC)
# 編譯SRC變數所代表的源代碼檔案,生成main可執行檔案
add_executable(main ${SRC})
(11)add_subdirectory: 向當前工程添加存放源檔案的子目錄,并可以指定中間二進制和目標二進制存放的位置
- 語法:add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
# 添加src子目錄,src中需有一個CMakeLists.txt
add_subdirectory(src)
2.常用的變數
PROJECT_NAME : 通過 project() 指定專案名稱
PROJECT_SOURCE_DIR: 工程的根目錄
PROJECT_BINARY_DIR : 執行 cmake 命令的目錄
CMAKE_CURRENT_SOURCE_DIR: 當前CMakeList.txt 檔案所在的目錄
CMAKE_CURRENT_BINARY_DIR : 編譯目錄,可使用 add subdirectory 來修改
EXECUTABLE_OUTPUT_PATH : 二進制可執行檔案輸出位置
LIBRARY_OUTPUT_PATH : 庫檔案輸出位置
BUILD_SHARED_LIBS: 默認的庫編譯方式 ( shared 或 static ) ,默認為 static
CMAKE_C_FLAGS : 設定 C 編譯選項
CMAKE_CXX_FLAGS : 設定 C++ 編譯選項
CMAKE_CXX_FLAGS_DEBUG: 設定編譯型別 Debug 時的編譯選項
CMAKE_CXX_FLAGS_RELEASE: 設定編譯型別 Release 時的編譯選項
CMAKE_GENERATOR : 編譯器名稱
CMAKE_COMMAND : CMake 可執行檔案本身的全路徑
CMAKE_BUILD_TYPE : 工程編譯生成的版本, Debug / Release
四、CMake編譯工程
1.目錄結構
專案主目錄(頂層目錄)要包含一個CMakeLists.txt檔案,
有兩種方式設定編譯規則:
(1)包含源檔案的子目錄中包含CMakeLists.txt,主目錄的CMakeLists.txt通過add_subdirectory指令添加子目錄即可,
(2)包含源檔案的子目錄并沒有CMakeLists.txt,子目錄編譯規則體現在主目錄的CMakeLists.txt中,
2. 編譯流程
在linux底下的編譯流程如下:
- 撰寫CmakeLists.txt
- 執行cmake PATH 生成Makefile(PATH是頂層CMakeLists.txt所在的目錄)
- 執行make命令
3. 兩種構建方式
- 內部構建
直接執行cmake . 在當前目錄編譯本目錄的CMakeLists.txt,會生成大量的中間檔案,和工程檔案放在一塊會顯得雜亂無章, - 外部構建(簡潔)
將編譯產生的中間檔案和源檔案放到不同的目錄中

外部構建:


五、一個簡單工程的構建
1.目錄結構
分別創建bin目錄,build目錄,include目錄,src目錄,

2.CMakeLists.txt

3.程序
使用外部構建的方式,進入build目錄執行cmake … ,生成中間檔案(Makefile檔案等),然后執行make命令,生成可執行檔案(bin目錄下),


可以看到已經生成了可執行檔案和Makefile檔案

執行結果:

六、靜態庫和動態庫的編譯控制
把上面的max和swap源檔案直接生成靜態庫或者動態庫,讓外部程式直接進行鏈接使用,代碼結構如下:

最外層的CMakeLists.txt是總控制的編譯檔案,內容如下:

src中的CMakeLists.txt是生成庫檔案的,內容如下:

test中的CMakeLists.txt是負責生成可執行檔案并進行鏈接的,內容如下:

執行完cmake 和make命令后:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/287258.html
標籤:其他
上一篇:K8S常用工具<k8s_pod.sh> 一鍵腳本登錄kubectl exec <pod>
下一篇:基于LINUX下的多執行緒
