所有的計算機問題都可以被其他層級的目錄/函式/模組/包解決,這是站在抽線的角度理解問題解決的通用方法。
make即製作,製作解決問題的乙個程式。任何沒意義的重複工作都應該被拋棄。
配置檔案cmakelist.txt可以理解為一種選單,這個思維可以用於任何開發任務。軟體會自動讀取配置檔案,這等於是一種輸入而已。
比如要解任意問題,我們首先建立乙個 專案/空間/目錄 demo1,在裡面寫了乙個原始檔main.cc,要編譯為二進位制,編寫cmakelists.txt於同乙個目錄下面,編譯出乙個二進位制我們需要依次編譯出各個依賴原始檔:
# cmake 最低版本號要求
cmake_minimum_required (version 2.8)
# 專案資訊,可以理解為解決這個問題是通過專案這個層級來抽象的
project (demo1)
# 指定生成目標
add_executable (demo main.cc) # 命令由命令名稱、小括號和引數組成,引數之間使用空格進行間隔。
cmake .
的目的是得到本地平台的製作檔案也就是makefile,然後再用本地的make程式使用生成的makefile檔案,命令編譯後得到demo可執行檔案。
前面乙個main.cc就解決問題,說明函式不多,假如再複雜,那麼就變成多個檔案了。
./demo2
+--- main.cc
+--- mathfunctions.cc
+--- mathfunctions.h
# cmake 最低版本號要求
cmake_minimum_required (version 2.8)
# 專案資訊
project (demo2)
# 查詢當前目錄下的所有原始檔
# 並將名稱儲存到 dir_srcs 變數
aux_source_directory(. dir_srcs) # 這個命令就是查詢指定目錄下的所有原始檔cc檔案,這個變數順序是有點怪怪的
# 指定生成目標
add_executable(demo $)
# add_executable(demo main.cc mathfunctions.cc) # 不確定這些cc檔案是否有順序要求
所有複雜的情況最終都歸結到乙個原始檔的情況,所以層層消除目錄就好了。
./demo3
+--- main.cc
+--- math/
+--- mathfunctions.cc
+--- mathfunctions.h
如果math/
目錄程式設計乙個原始檔,那麼是不是情況又等同於上面一種呢,其實最終是通過鏈結庫的形式完成對接的。所以現在math/
目錄下放乙個cmakelists.txt
檔案
# 查詢當前目錄下的所有原始檔, 並將名稱儲存到 dir_lib_srcs 變數
# 可見這個檔案就收斂到乙個目錄,多個原始檔的情形
aux_source_directory(. dir_lib_srcs)
# 生成鏈結庫,好像生成庫鏈結不需要專案資訊了
add_library (mathfunctions $) # 和add_executable相對應
# cmake 最低版本號要求
cmake_minimum_required (version 2.8)
# 專案資訊
project (demo3)
# 查詢當前目錄下的所有原始檔
# 並將名稱儲存到 dir_srcs 變數
aux_source_directory(. dir_srcs)
# 新增 math 子目錄,感覺這不操作會呼叫子目錄的cmakelists.txt,先處理這個
add_subdirectory(math)
# 指定生成目標
add_executable(demo main.cc)
# 新增鏈結庫,可以理解為g++裡新增鏈結庫的操作
target_link_libraries(demo mathfunctions) # 和add_executable同時使用的
這個應該好理解的,前面已經把所有複雜的檔案結構都概括了,下面側重選項了。比如新增額外的庫,額外的庫是否需要編譯等等。這些選項都是咋頂層cmakelists.txt裡面處理的,不要在乎名字,重要的是思路:
# cmake 最低版本號要求
cmake_minimum_required (version 2.8)
# 專案資訊
project (demo4)
# 加入乙個配置標頭檔案,用於處理 cmake 對原始碼的設定
# 配置檔案命令用於加入乙個配置標頭檔案 config.h ,這個檔案由 cmake 從 config.h.in 生成,通過這樣的機制,將可以通過預定義一些引數和變數來控制**的生成。
configure_file (
"$/config.h.in" # 這兩個檔案是需要編輯的
"$/config.h"
)# 是否使用自己的 mathfunctions 庫
option (use_mymath "use provided math implementation" on) # 定義了乙個配置項
# 是否加入 mathfunctions 庫
if (use_mymath)
include_directories ("$/math")
add_subdirectory (math) #
set (extra_libs $ mathfunctions)
endif (use_mymath)
# 查詢當前目錄下的所有原始檔
# 並將名稱儲存到 dir_srcs 變數
aux_source_directory(. dir_srcs)
# 指定生成目標
add_executable(demo $)
target_link_libraries (demo $)
修改 main.cc 檔案
之後修改 main.cc 檔案,讓其根據use_mymath
的預定義值來決定是否呼叫標準庫還是 mathfunctions 庫:
#include "config.h"
#ifdef use_mymath
#include "math/mathfunctions.h"
#else
#include #endif
編寫 config.h.in 檔案
上面的程式值得注意的是第2行,這裡引用了乙個 config.h 檔案,這個檔案預定義了 use_mymath 的值。但我們並不直接編寫這個檔案,為了方便從 cmakelists.txt 中匯入配置,我們編寫乙個 config.h.in 檔案,內容如下:
其實作為就是on/off
#cmakedefine use_mymath
編譯專案
現在編譯一下這個專案,為了便於互動式的選擇該變數的值,可以使用ccmake
命令(也可以使用cmake -i
命令,該命令會提供乙個會話式的互動式配置介面):
就是make install的作用,具體的看原部落格吧cmake 入門實戰 | hahack。對scons: a software construction tool - scons比較感興趣。
CMake 使用方法
cmake是乙個跨平台的安裝 編譯 工具,可以用簡單的語句來描述所有平台的安裝 編譯過程 他能夠輸出各種各樣的makefile或者project檔案,能測試編譯器所支援的c 特性,類似unix下的automake。cmake 使用方法 cmake的所有的語句都寫在乙個叫 cmakelists.txt...
Cmake 使用方法
cmake是乙個跨平台的安裝 編譯 工具,可以用簡單的語句來描述所有平台的安裝 編譯過程 他能夠輸出各種各樣的makefile或者project檔案,能測試編譯器所支援的c 特性,類似unix下的automake。cmake 使用方法 cmake的所有的語句都寫在乙個叫 cmakelists.txt...
CMake 使用方法
cmake是乙個跨平台的安裝 編譯 工具,可以用簡單的語句來描述所有平台的安裝 編譯過程 他能夠輸出各種各樣的makefile或者project檔案,能測試編譯器所支援的c 特性,類似unix下的automake。cmake 使用方法 cmake的所有的語句都寫在乙個叫 cmakelists.txt...