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
我們需要分別在demo
和utils
目錄下各自編寫乙個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 install
和make 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 ...