1. 程式人生 > >Cmake 自學筆記(linux)(一)

Cmake 自學筆記(linux)(一)

一. cmake有什麼用?

可自行百度,簡單理解就是跨平臺編譯

複雜工程程式碼之間的呼叫關係複雜而嚴格,如果我想在這樣複雜的框架下進行二次開發,顯然只擁有它的原始碼是遠遠不夠的,還需要清楚的明白這幾十個專案之間的複雜關係,在沒有原作者的幫助下進行這項工作幾乎是不可能的。

即使是原作者給出了相關的結構文件,對新手來說建立工程的過程依舊是漫長而艱辛的,因此CMake的作用就凸顯出來了。原作者只需要生成一份CMakeLists.txt文件,框架的使用者們只需要在下載原始碼的同時下載作者提供的CMakeLists.txt,就可以利用CMake,在”原作者的幫助下“進行工程的搭建。

所以CMakeLists的作用就是告訴你這些原始碼之間的關係,也就是如何通過CMakeLists將這些原始碼搭建成一個工程,而那些ide其實就是根據CMakeLists來搭建工程的,比如我們熟悉的qtcreator(還記得用qt搭建px4的開發環境時就是先載入這個CMakeLists)。

而cmake的作用就是按照CMakeLists去執行編譯的工具。但要注意,cmake這個命令不是用來執行編譯,而是用來執行CMakeLists構建工程,得到makefile資料夾,這個資料夾存放的是編譯規則,接下來就需要使用make命令編譯這個makefile資料夾

二. 先從一個簡單例子開始

1.先新建了一個資料夾(cmake-learning),在該資料夾下新建兩個檔案(main.cpp和CMakeLists.txt)和一個新的資料夾(build)。
2.在CMakeLists.txt中寫入

 PROJECT(test) 
 ADD_EXECUTABLE(mytest ./main.cpp)

3.在main.cpp中寫入

#include "stdio.h"
int main(){
    printf("6666666\n");
    return 0;
}

4.執行以下命令

cd ~/cmake-learning/build //必須要進入該資料夾下,否則由cmake產生的檔案不在裡面。
cmake ..                  //cmake的作用不是編譯,而是用來CMakeList.txt檔案生成makefile的。並且cmake 後面要有.. ,build資料夾下什麼都沒有,光cmake當然不行。..用來指出 CMakeList.txt 所在的位置

5.在bulid目錄下執行tree命令,可看到一個makefile檔案, makefile關係到了整個工程的編譯規則。

。接下來我們就需要去執行這個makefile檔案,在bulid下用命令make即可。此時ls後可以看到有一個mytest的可執行檔案。

6.最後執行這個mytest檔案即可。

./mytest

細節補充(高手忽略):
1.gedit 檔名--------用來建立檔案並編寫
2.touch 檔名 -------建立檔案
3.mkdir 資料夾名字 ---------建立資料夾
4.這個資料夾的名字叫CMakeLists.txt,注意複數和大小寫
5.CMakeLists.txt中的命令大小寫隨意。
6. ./檔名 命令可以直接執行該目錄下的檔案
7.注意:CMakeList.txt 檔案中,命令名字是不區分大小寫的,而引數和變數是大小寫相關的。
三.分析CmakeLists.txt檔案

1.cmake是通過解析CMakeLists.txt指令碼來生成專案需要的編譯檔案的。它可以生成多種不同型別的編譯檔案如makeflie、ninja等;

2.CMakeLists.txt的編寫依賴大量cmake提供的函式或者巨集,如PROJECT、SET等,只要掌握了這些巨集的含義,就可以讀懂CMakeLists.txt,從而瞭解工程的結構。

3.cmake中常用的函式或巨集

這些都是cmake提供好的,可以直接在CMakeLists.txt中使用,他們看起來就像是C語言的巨集或者函式

PROJECT(工程名字)

這條指令會自動建立兩個變數:

project name>_BINARY_DIR(二進位制檔案儲存路徑) project name>_SOURCE_DIR(原始碼路徑)

Cmake 系統也幫助我們預定義了 PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR其值與上述對應相等

set(變數名 變數值)
SET(VAR [VALUE] [CACHE TYPEDOCSTRING [FORCE]])
SET(SRC_LIST main.c t1.c t2.c):即SPC_LIST代表main.c t1.c t2.c
SET(SRC_LIST main.c):同上

include

用法:include(file or module)
例如:include(test.cmake)
說明:與c語言的include類似

include_directories

用法:include_directories(dir1 dir2 ……)
例如:include_directories(“…/my/include” “…/my/include2”)
說明:用於在現有標頭檔案搜尋路徑後面增加搜尋路徑

target_link_libraries

用法:target_link_libraries( target lib1 lib2 ……)
例如:target_linke_libraries(test libmy.so)
說明:target引數一般是add_excutable中指定的程式名

PROJECT_SOURCE_DIR

說明:這是cmake預定義號的一個巨集,表示工程的根目錄,可以直接使用(即原始碼路徑)

link_directories

說明:增加動態連結庫的搜尋路徑,需要注意的是必須使用絕對路徑。(相對路徑其實也有辦法用,但需要更多的配置,麻煩)

find_package

說明:當無法定位庫的具體位置時,可以使用此命令進行查詢。利用命令:cmake –help-module-list 和 cmake –help-module 來獲取幫助資訊。
例如:find_package(GTK2)

ADD_EXECUTABLE(生成的可執行檔名 生成該可執行檔案的原始檔)
ADD_EXECUTABLE(helloSRCLIST):{SRC_LIST}):通過{SRC_LIST}生成hello的可執行檔案

MESSAGE(訊息型別 訊息內容)
MESSAGE([SEND_ERROR | STATUS| FATAL_ERROR] “message to display”)

相關推薦

Cmake 自學筆記(linux)

一. cmake有什麼用? 可自行百度,簡單理解就是跨平臺編譯 複雜工程程式碼之間的呼叫關係複雜而嚴格,如果我想在這樣複雜的框架下進行二次開發,顯然只擁有它的原始碼是遠遠不夠的,還需要清楚的明白這幾十個專案之間的複雜關係,在沒有原作者的幫助下進行這項工作幾乎是不

Cmake 自學筆記(linux)

前言:前面的五節是對於cmake的入門內容,接下來繼續學習其他內容 引入: 前面我們在學習時,都是在自己寫標頭檔案和相關的庫,可當我們要使用第三方的庫時,我們就需要知道他的標

Cmake 自學筆記(linux)

前言:前面一節我們初步學習了對所有的檔案進行分類管理,可是還是不夠正規,我們希望生成的可執行檔案在bin資料夾下,而庫檔案在lib資料夾下。 我看網上主要介紹了兩種方法,但我個人覺得第一種好記也好用。就是對頂層的cmakelists檔案修改就可以了,在上一

Cmake 自學筆記(linux)

前言:觀察資料夾下的檔案,發現原始碼(main .h .c)放在同一個路徑下,還是不太正規,怎麼辦呢?分開放唄…….(當然,分開的這個過程由我們自己完成) 我們期望的結構: 即main.c在src下(src=source code),標頭檔案和他的.

linux學習筆記整理

5.7 clean fig 轉載 net-tools linux 分別是 repo 兩個 ------------------------------------------ 轉載內容 --------------------- Linux升級命令有兩個分別是yum

Linux 軟件安裝

修正 是個 上網 新版 打包 執行文件 cal 進行 停止 前言:在Linux中安裝軟件時,我們經常要考慮到這樣幾個個問題: (1).怎樣安裝軟件; (2).軟件安裝在什麽地方; (3).如何卸載刪除不要的軟件...... 下

初識Linux

指定 mod data watermark username apple home 管理員 管道 一、命令提示符格式 1.默認格式: [root@centos6 ~]#[用戶名@主機名前綴 目錄路徑後綴]#|$ (root是為#,普通用戶時為$)2.查

Hive筆記整理

大數據 Hive [TOC] Hive筆記整理(一) Hive Hive由facebook貢獻給Apache,是一款建立在Hadoop之上的數據倉庫的基礎框架。 數據倉庫 特點——關於存放在數據倉庫中的數據的說明: 是能夠為企業的各個級別的決策提供數據支撐的數據 其實說白了,就是一個存放數據

HBase筆記整理

大數據 HBase [TOC] HBase筆記整理(一) 行列式數據庫 行式數據庫: 可以簡單的理解為類似傳統的rdbmspaint這些數據,存放的數據都是結構化的數據。 行式數據庫,是有利於全表數據的掃描,不利於只查詢個別字段 列式數據庫: 對行式數據庫的一個改進,將部分列(或者說有關聯的一些列)

Kafka筆記整理

大數據 消息隊列 消息訂閱系統 Kafka [TOC] Kafka筆記整理(一) Kafka簡介 消息隊列(Message Queue) 消息 Message 網絡中的兩臺計算機或者兩個通訊設備之間傳遞的數據。例如說:文本、音樂、視頻等內容。 隊列 Queue 一種特殊的線性表(

Redis筆記整理:Redis安裝配置與數據類型操作

數據庫 NoSQL Redis [TOC] Redis筆記整理(一):Redis安裝配置與數據類型操作 Redis簡介 Redis是一個開源(BSD許可),內存存儲的數據結構服務器,可用作數據庫,高速緩存和消息隊列代理。 它支持字符串、哈希表、列表、集合、有序集合,位圖,hyperloglo

ElasticSearch筆記整理:簡介、REST與安裝配置

大數據 ElasticSearch ELK [TOC] ElasticSearch簡介 ElasticSearch是一款基於Apache Lucene構建的開源搜索引擎,它采用Java編寫並使用Lucene構建索引、提供搜索功能,ElasticSearch的目標是讓全文搜索變得簡單,開發者可以通

Storm筆記整理:簡介與設計思想

大數據 實時計算 Storm [TOC] 實時計算概述 有別於傳統的離線批處理操作(對很多數據的集合進行的操作),實時處理,說白就是針對一條一條的數據/記錄進行操作,所有的這些操作進行一個匯總(截止到目前為止的所有的統計總和)。 實時計算與離線計算比較 Bounded:有界 離線計算面臨

Scala筆記整理:scala基本知識

大數據 Scala [TOC] Scala簡介 Scala是一門多範式(multi-paradigm)的編程語言,設計初衷是要集成面向對象編程和函數式編程的各種特性。 Scala運行在Java虛擬機上,並兼容現有的Java程序。 Scala源代碼被編譯成Java字節碼,所以它可以運行於JVM之上,並

Spark筆記整理:spark單機安裝部署、分布式集群與HA安裝部署+spark源碼編譯

大數據 Spark [TOC] spark單機安裝部署 1.安裝scala 解壓:tar -zxvf soft/scala-2.10.5.tgz -C app/ 重命名:mv scala-2.10.5/ scala 配置到環境變量: export SCALA_HOME=/home/uplooking

Linux

href TP http itl AR www 用戶態 inux title 參考文檔: Linux探秘之用戶態與內核態:https://www.cnblogs.com/bakari/p/5520860.htmlLinux(一)

Python提高筆記整理

局部變量 glob 變量 數字 查找 cpu reload imp 面向對象 什麽是GIL?GIL對多線程的影響GIL全稱Global Interpreter Lock(全局解釋器鎖)。GIL和Python語言沒有任何關系,只是因為歷史原因導致在官方推薦的解釋器Cpytho

讀《有效管理的5大兵法》筆記摘錄核心價值觀:求實、進取、創新、協同、分享

思維 協同 經典 現在 公司 高級 緣分 前行 其他 一、核心價值觀:求實、進取、創新、協同、分享 1、求實 求實:就是刨根問底,不誇大其詞,不以訛傳訛,不草率下結論,不不懂裝懂,不偷換概念,不當信息二傳手 如何求實,求甚解? 不管什麽事情,問五個為什麽,就像永遠有十萬個為

從Paxos到Zookeeper分散式一致性原理與實踐 讀書筆記 分散式架構

1.1 從集中式到分散式  1 集中式特點  結構簡單,無需考慮對多個節點的部署和節點之間的協作。  2  分散式特點 分不性:在時間可空間上隨意分佈,機器的分佈情況隨時變動 對等性:計算機之間沒有主從之分,所有計算機之間是對等的。副本是分散式系統對資料

吳恩達老師機器學習筆記SVM

時隔好久沒有再拾起機器學習了,今日抽空接著學 今天是從最簡單的二維資料分類開始學習SVM~ (上圖為原始資料) SVM的代價函式 這裡套用以前logistic迴歸的模板改一下下。。 load('ex6data1.mat'); theta=rand(3,1); [