示例源碼
在 linux 平臺(tái)下使用 CMake 生成 Makefile 并編譯的流程如下:
- 編寫 CMake 配置文件 CMakeLists.txt
- 執(zhí)行命令 cmake PATH 或者 ccmake PATH 生成 Makefile
ccmake 和 cmake 的區(qū)別在于前者提供了一個(gè)交互式的界面。
币呵。其中谴轮, PATH 是 CMakeLists.txt 所在的目錄。
- 使用 make 命令進(jìn)行編譯距辆。
入門案例一(單文件)
先看下目錄和源碼
代碼的邏輯非常簡(jiǎn)單就是求10的立方。
重點(diǎn)時(shí)候在CMakeLists.txt
# '#'行后面的都是注釋
# CMake 最低版本號(hào)要求
cmake_minimum_required (VERSION 2.8)
# 項(xiàng)目信息
project (Calc)
# 指定生成目標(biāo) main為編譯生成文件, main.cpp為源文件
add_executable(main main.cpp)
-
#
為注釋標(biāo)識(shí) -
cmake_minimum_required
是最低版本要求娃豹,這個(gè)是必須要的 -
project
項(xiàng)目信息 -
add_executable
將main.cpp編譯成main
如果我們將cmake_minimum_required (VERSION 2.8)
版本改成2.9.2退客。我的機(jī)器上cmake版本是cmake version 2.8.12.2
骏融。執(zhí)行cmake .
后報(bào)錯(cuò):
正常執(zhí)行完
cmake
后,會(huì)在根目錄下生成Makefile萌狂。然后我們就可以用make
來編譯了档玻。
入門案例二(同目錄多文件)
這里我們?cè)诎咐坏幕A(chǔ)上新增Math.h
、Math.cpp
#include "Math.h"
long pow(int base,int power){
long res=1;
for(int i=0; i<power; i++) {
res*=base;
}
return res;
}
然后修改main.cpp的include文件茫藏,將使用系統(tǒng)的math.h
替換成我們自己的Math.h
#include <iostream>
#include "Math.h"
using namespace std;
int main(){
int x=10;
int y=3;
int res=pow(10,3);
cout<<res<<endl;
return 0;
}
修改CMakeLists.txt
方法一
add_executable(main main.cpp Math.cpp)
在add_executable
參數(shù)中加入Math.cpp
方法二
如果源文件很多误趴,這樣寫就很蛋疼了。我們可以使用aux_source_directory
命令
aux_source_directory(<dir> <variable>)
該命令會(huì)查找指定目錄下的所有源文件务傲,然后將結(jié)果存進(jìn)指定變量名凉当。
# '#'行后面的都是注釋
# CMake 最低版本號(hào)要求
cmake_minimum_required (VERSION 2.8)
# 項(xiàng)目信息
project (Calc)
# 指定生成目標(biāo) main為編譯生成文件, main.cpp為源文件
# 方法一:一個(gè)個(gè)添加
# add_executable(main main.cpp Math.cpp)
# 方法二:查找目錄下文件到變量中树灶,然后引用變量
# 查找當(dāng)前目錄下的所有源文件
# 并將名稱保存到 DIR_SRCS 變量
aux_source_directory(. DIR_SRCS)
# 指定生成目標(biāo)
add_executable(Demo ${DIR_SRCS})
入門案例三(多目錄纤怒、多文件)
對(duì)于這種情況,需要分別在項(xiàng)目根目錄 Simple和 math 目錄里各編寫一個(gè) CMakeLists.txt 文件天通。為了方便泊窘,我們可以先將 math 目錄里的文件編譯成靜態(tài)庫(kù)再由 main 函數(shù)調(diào)用。
math瞎的CMakeLists.txt內(nèi)容為:
# 查找當(dāng)前目錄下的所有源文件
# 并將名稱保存到 DIR_LIB_SRCS 變量
aux_source_directory(. DIR_LIB_SRCS)
# 生成鏈接庫(kù)
add_library (MathFunctions ${DIR_LIB_SRCS})
當(dāng)然像寒,main.cpp引入的頭文件也要修改烘豹,math.h的位置已經(jīng)變了。
#include "math/Math.h"
入門案例四(自定義編譯選項(xiàng))
# '#'行后面的都是注釋
# CMake 最低版本號(hào)要求
cmake_minimum_required (VERSION 2.8)
# 項(xiàng)目信息
project (Calc)
# 加入一個(gè)配置頭文件诺祸,用于處理 CMake 對(duì)源碼的設(shè)置
configure_file (
"${PROJECT_SOURCE_DIR}/config.h.in"
"${PROJECT_BINARY_DIR}/config.h"
)
# 是否使用自己的 MathFunctions 庫(kù)
option (USE_MYMATH
"Use provided math implementation" ON)
# 是否加入 MathFunctions 庫(kù)
if (USE_MYMATH)
include_directories ("${PROJECT_SOURCE_DIR}/math")
add_subdirectory (math)
set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)
# 查找當(dāng)前目錄下的所有源文件
# 并將名稱保存到 DIR_SRCS 變量
aux_source_directory(. DIR_SRCS)
# 指定生成目標(biāo)
add_executable(main main.cpp)
# 添加鏈接庫(kù)
target_link_libraries(main ${EXTRA_LIBS})
添加config.h.in
#cmakedefine USE_MYMATH
修改main.cpp
#include <iostream>
#include "config.h"
#ifdef USE_MYMATH
#include "math/Math.h"
#else
#include <math.h>
#endif
using namespace std;
int main(){
int x=10;
int y=3;
int res=pow(10,3);
cout<<res<<endl;
return 0;
}
如果定義了USE_MYMATH就使用自己的Math.h否則include系統(tǒng)的math.h
這里我們可以使用ccmake命令携悯,可以選擇ON或OFF。然后按c進(jìn)行配置筷笨。然后再按g進(jìn)行生成
入門案例五(安裝和測(cè)試)
添加版本號(hào)
首先修改頂層 CMakeLists 文件憔鬼,在 project 命令之后加入如下兩行:
# 設(shè)置版本號(hào)
set (Demo_VERSION_MAJOR 1)
set (Demo_VERSION_MINOR 0)
為了在代碼中獲取版本信息,我們可以修改 config.h.in 文件胃夏,添加兩個(gè)預(yù)定義變量:
#define Demo_VERSION_MAJOR @Demo_VERSION_MAJOR@
#define Demo_VERSION_MINOR @Demo_VERSION_MINOR@
程序中就可以獲取相關(guān)信息
cout<<"Version "<<Demo_VERSION_MAJOR<<"."<<Demo_VERSION_MINOR<<endl;
生成安裝包
首先在頂層的 CMakeLists.txt 文件尾部添加下面幾行:
# 構(gòu)建一個(gè) CPack 安裝包
include (InstallRequiredSystemLibraries)
set (CPACK_RESOURCE_FILE_LICENSE
"${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
set (CPACK_PACKAGE_VERSION_MAJOR "${Demo_VERSION_MAJOR}")
set (CPACK_PACKAGE_VERSION_MINOR "${Demo_VERSION_MINOR}")
include (CPack)
上面的代碼做了以下幾個(gè)工作:
導(dǎo)入 InstallRequiredSystemLibraries 模塊轴或,以便之后導(dǎo)入 CPack 模塊;
設(shè)置一些 CPack 相關(guān)變量仰禀,包括版權(quán)信息和版本信息照雁,其中版本信息用了上一節(jié)定義的版本號(hào);
導(dǎo)入 CPack 模塊答恶。
- 生成二進(jìn)制安裝包:
cpack -C CPackConfig.cmake
- 生成源碼安裝包
cpack -C CPackSourceConfig.cmake