1. cmake與make 的區別
程式的生成過程分為:原始檔–編譯–鏈結,這幾個過程。
如果原始檔太多,乙個乙個編譯將成為問題,因此大佬們設計了一種批量編譯程式的工具(make),這種工具需要根據規則對原始碼進行編譯,這種規則就是makefile。
對於乙個大的工程使用makefile編譯,寫這個makefile文字會比較複雜,為此大佬們又設計了一種工具,在讀入原檔案以後,自動生成makefile檔案,這就是cmake,它能夠輸出各種各樣makefile或者project檔案,減輕了手寫makefile的負擔,因此cmake被稱為半自助編譯,兩者之間的關係如圖1所示,同樣,cmake也需要遵循一定的語法規則,這就是下面要講的內容。
參考資料: link.
2. 同一目錄下只有乙個原檔案(內部編譯)
a.建立ch1目錄,在該目錄下建立兩個檔案:main.cpp, cmakelists.txt。他們關係如下圖所示:
dong@pc:~/cmake/ch1$ tree
.├── cmakelists.txt
└── main.cpp
其中main.cpp**為:
#includeusing namespace std;
int main()
cmakelists.txt的**為:
cmake_minimum_required(version 2.8)
project(ch1)
add_executable(main main.cpp)
cmake_minimum_required:表示cmake的最低版本要求
project:設定生成的工程名
add_executable:定義該工程會生成乙個檔名為main的可執行檔案
b.回到ch1目錄下,執行:
dong@pc:~/cmake/ch1$ cmake .
c.執行
dong@pc:~/cmake/ch1$ make
d.執行
dong@pc:~/cmake/ch1$ ./main
hello slam
可以看到程式成功執行。
3.同一目錄下只有乙個原檔案(外部編譯)
內部編譯生成的中間檔案和執行檔案與原檔案混合在一起不方便管理,為此這裡推薦一種外部編譯方式。
a.建立ch2目錄,在ch2目錄下建立:build目錄,main.cpp和cmakelists.txt。其中main.cpp和cmakelists.txt與ch1中的內容相同,結構如下圖所示,
dong@pc:~/cmake/ch2$ tree
.├── build
├── cmakelists.txt
└── main.cpp
b.進入build目錄
dong@pc:~/cmake/ch2$ cd build/
c.執行
dong@pc:~/cmake/ch2/build$ cmake ..
d.執行
dong@pc:~/cmake/ch2/build$ make
e.執行
dong@pc:~/cmake/ch2/build$ ./main
hello slam
可以看到最後生成的中間檔案和目標檔案在build目錄下。
4.同乙個目錄下多個原檔案
建立ch3目錄,在ch3目錄下建立:build目錄,main.cpp,fun.cpp, fun.h,cmakelists.txt,結構圖如下圖所示:
dong@pc:~/cmake/ch3$ tree
.├── build
├── cmakelists.txt
├── fun.cpp
├── fun.h
└── main.cpp
a.各檔案內容
fun.cpp
#include#include"fun.h"
using namespace std;
void function(void)
fun.h
#ifndef _fun_h
#define _fun_h
void function(void);
#endif
main.cpp
#include#include"fun.h"
using namespace std;
int main()
cmakelists.txt
cmake_minimum_required(version 2.8)
project(ch1)
add_executable(main main.cpp fun.cpp)
這裡相對於第3節內容在cmakelists.txt中的add_executable()新增了一丟丟內容,其他沒有改變。
ps:對於多個原檔案我們可以使用
add_executable(main a.cpp b.cpp ...)
也可以
set(src_list a.cpp b.cpp ...)
add_executable(main $)
還可以
aux_source_directory(. src_list)
add_executable(main $)
aux_source_directory(dir var) : 指定目錄下所有的原始檔儲存在乙個變數中,dir 表示指定目錄,var用於存放原始檔列表的變數。
b.其他步驟與第3節內容相同。
5. 對庫的鏈結
建立ch6目錄,目錄結構如下所示
dong@pc:~/cmake/ch6$ tree
.├── bin
├── build
├── cmakelists.txt
├── lib
│ ├── libfun.a
│ └── libfun.so
├── lib_fun
│ ├── cmakelists.txt
│ ├── fun.cpp
│ └── fun.h
└── src
├── cmakelists.txt
└── main.cpp
這裡ch6下的cmakelists.txt為
cmake_minimum_required(version 2.8)
project(ch6)
add_subdirectory(src)
add_subdirectory(lib_fun)
這裡add_subdirectory()用於向當前工程新增存放原始檔的子目錄。
src目錄下的cmakelists.txt為:
aux_source_directory(. src_list)
include_directories(../lib_fun)
link_directories($/lib)
add_executable(main $)
target_link_libraries(main fun)
set(executable_output_path $/bin)
這裡:
include_directories()用來向工程新增多個指定的標頭檔案搜尋路徑
link_directories()新增非標準的共享庫搜尋路徑
target_link_libraries(target library1 library2)用來為target新增需要鏈結的共享庫。
參考資料: link.
Cmake學習筆記(1) 基礎應用
首先在大多數windows環境下編寫 都是有ide的,編譯處理資源等都有整合在編譯器內,且自動化完成了 而在linux環境下開發這種ide也是有的,但是由於linux環境常常是基於命令列的,且如果做嵌入式的linux開發這時候如果還是基於ide的就有些困難了,所以cmake的就是乙個相對比較好用的自...
CMake 入門學習1 Hello World
三 cmakelist.txt檔案說明 四 關於cmake在centos7下的公升級 cmake是一款跨平台的 通過cmakelist.txt構建makefile的工具。入門 include int main int argc,char ar set the minimum version of c...
Script系列 之CMake學習總結
date 2018.12.15 1 參考 make教程 cmake簡介 2 前言 前面講過makefile的自動化編譯過程,可參考多平台編譯以及makefile自動化編譯總結,make以及makefile是用於進行自動化編譯的工具,可以實現對工程的自動化編譯。這裡講的是cmake和cmakelist...