CMake快速入門教程

2022-08-01 09:54:09 字數 4528 閱讀 5526

make工具因遵循不同的規範和標準,執行的makefile的格式也是不同。主流的make工具包括:

每個平台都有自己的工具,則帶來了很大的平台相容性問題。cmake是一種跨平台的編譯工具。

準備階段:

基本流程:

乙個簡單的樣例:

# cmake的最低版本要求

cmake_minimum_required (verions 2.8)

# 專案資訊

project(demo)

# 指定生成目標

add_executable(demo demo.cc)

語法規則:

在實際專案中,一般不會只有乙個demo.cc原始碼檔案,常為乙個目錄下多個原始檔。假設目錄結構如下:

./demo

|-- main.cc

|-- foo.cc

|-- foo.h

此時的cmakelists.txt內容可以更新為如下:

# cmake的最低版本要求

cmake_minimum_required (verions 2.8)

# 專案資訊

project(demo)

# 指定生成目標

add_executable(demo demo.cc foo.cc)

即只需要在add_executable裡把依賴的foo.cc原始檔新增進來即可。

但引入另乙個問題:新增的原始檔越來越多,總不能乙個個手動加進來吧?

cmake中有aux_source_directory命令,會查詢指定目錄下所有原始檔,並存放到指定的變數名中:

# cmake的最低版本要求

cmake_minimum_required (verions 2.8)

# 專案資訊

project(demo)

# 查詢當前目錄下所有原始檔

aux_source_directory(. dir_srcs)

# 指定生成目標

add_executable(demo $)

針對乙個專案中包含了多了層級目錄,且每個目錄下都包含一些原始檔。若目錄結構如下:

./demo

|-- main.cc

|-- utils

|-- foo.cc

|-- foo.h

我們需要分別在demoutils目錄下各自編寫乙個cmakelists.txt檔案。

為了方便,可以先將utils目錄裡的檔案編譯成靜態庫,再由main函式呼叫。

根目錄中的cmakelists.txt

# cmake的最低版本要求,如果不滿足則報錯

cmake_minimum_required (verions 2.8 fatal_error)

# 專案資訊

project(demo)

# 新增 math 子目錄

add_subdirectory(utils)

# 指定生成目標

add_executable(demo main.cc)

# 新增鏈結庫

target_link_libraries(demo utils)

utils目錄中的cmakelists.txt

# 查詢當前目錄下的所有原始檔、並儲存到 dir_lib_srcs 變數中

aux_source_directory(. dir_lib_srcs)

# 生成鏈結庫

add_library(utils $)

如下是乙個專案的cmakelists.txt:

cmake_minimum_required(version 2.8)

project(demo)

# 定乙個開關選項,支援cmake時通過 -duse_myutils=off 指定

option(use_myuitls "whether use customized math" on)

# 自定義分支邏輯

if(use_myuitls)

include_directories("/utils")

add_subdirectory(utils)

set(extra_libs $ utils)

endif(use_myuitls)

# 查詢目錄下所有原始檔

aux_source_directory(. dir_srcs)

# 新增執行檔案

add_executable(demo $)

# 鏈結靜態庫

target_link_libraries(demo $)

關於option的生效機制,這裡詳細解釋下。如main.cc中的**:

#include #include #include "config.h"  // 此標頭檔案是cmake自動生成的

#ifdef use_pyutils

#include "utils/foo.h"

#else

#include // 假設標準庫有foo.h標頭檔案

#endif

為了打通cmakelists.txt一鍵可攜式配置,我們需要編寫乙個config.h.in檔案:

#cmakedefine use_myutils
這樣,在執行cmake命令時,就可以根據配置的引數,自動生成option相關的標頭檔案。若指定-duse_myutils=on時,config.h中的內容為:

#define use_myutils
若為off時,則config.h的內容為:

/* #undef use_myutils */
camke支援安裝測試,通過在生成makefile後,使用make installmake test來執行。

接上述樣例,首先在utils/cmakelists.txt中加上如下內容:

# 指定utils庫的安裝路徑

install(targets utils destination bin)

install(files utils.h destination include)

demo/cmakelists.txt新增如下內容:

# 指定安裝路徑

install(targets demo destination bin)

install(files "$/config.h" destination include)

原理 & 流程:

關於測試,cmake提供乙個稱為ctest的測試工具,通過add_test命令新增:

# 啟用測試

enable_testing()

# 測試程式是否成功執行, arg*為函式接收的引數

add_test(test_run demo arg1 arg2)

add_test(test_usage demo)

set_tests_properties(test_usage properties pass_regular_expression "usage: .....")

add_test(test_result demo 10 2)

# 測試輸出的結果是否包含字串 "is 100"

set_tests_properties(test_result properties pass_regular_expression "is 100")

cmake支援gdb的方式很簡單,只需指定debug模式下開啟-g,乙個簡單的樣例如下:

set(cmake_build_type "debug")

# debug模式下編譯選項

set(cmake_cxx_flags_debug "$env -o0 -wall -g -ggdb")

# release模式下編譯選項

set(cmake_cxx_flags_release "$env -o3 -wall")

CMake入門教程(二)

1 使用set進行變數設定 之前使用 aux source directory命令將目錄下的所有.cpp檔案儲存到變數裡面,這樣,我們就不用乙個乙個去新增原始檔來生成可執行檔案,其實我們使用set命令也可以完成此操作。將untile.h以及untile.cpp兩個檔案新增到srcpath這個變數裡面...

matplotlib快速入門教程

matplotlib是乙個python的2d的繪相簿,通過使用matplotlib我們只需要幾行簡潔的 就可以繪圖,直方圖 功率譜 條形圖 錯誤圖 散點圖等。這篇部落格主要介紹的是matplotlib.pyplot模組,matplotlib其實就是乙個模仿matlab開發的python庫。當然,它不...

Linux快速入門教程

序言 linux是一套免費使用和自由傳播的類unix作業系統,這個系統是由全世界各地的成千上萬的程式設計師設計和實現的。下面的一些linux教程是為了快速入門,目的在於能快速掌握linux的基本知識,能對伺服器進行基本的維護。1.1 命令列操作 1.1.1 shell 簡介 1.1.2 shell ...