小白入門筆記:CMake編譯過(guò)程詳解
1、你好,CMake
1.1 CMake是什么?
我覺(jué)得針對(duì)這個(gè)問(wèn)題最簡(jiǎn)單(但不是最正確的)的回答應(yīng)該是:“CMake是服務(wù)于將源代111碼轉(zhuǎn)換成可執(zhí)行的文件的工具”。
將源碼轉(zhuǎn)換為可工作應(yīng)用會(huì)比較神奇。不僅是效果本身(即設(shè)計(jì)并賦予生命的工作機(jī)制),而且是將理念付諸于過(guò)程的行為本身。
CMake本身是一個(gè)工具集,由五個(gè)可執(zhí)行的程序組成:cmake、ctest、cpack、cmake-gui和ccmake,其中cmake可以說(shuō)是出鏡率最高的明星級(jí)別程序了,它用于在構(gòu)建項(xiàng)目的第一步,進(jìn)行項(xiàng)目的配置、生成和構(gòu)建項(xiàng)目的主要可執(zhí)行文件的工作。其他的程序們ctest用于運(yùn)行和報(bào)告測(cè)試結(jié)果的測(cè)試驅(qū)動(dòng)程序,cpack用來(lái)生成安裝程序和源包的打包程序,cmake-gui是 cmake 的圖形界面,ccmake(注意ccmake比cmake多了一個(gè)c)也是用于圖形界面,與cmake-gui不同的地方在于ccmake是基于控制臺(tái)(terminal)的圖形界面。
1.2 CMake設(shè)計(jì)初衷是為了什么?
CMake設(shè)計(jì)的出發(fā)點(diǎn)在于面向開(kāi)發(fā)者,而開(kāi)發(fā)者的工作流程基本是: 設(shè)計(jì)、編碼和測(cè)試;理想情況下,這個(gè)過(guò)程應(yīng)該從一個(gè)簡(jiǎn)單地按鈕開(kāi)始。在更改了代碼之后,工具將以智能的、快速的、可擴(kuò)展的方式,在不同的操作系統(tǒng)和環(huán)境中以相同的方式工作。支持多個(gè)集成開(kāi)發(fā)環(huán)境(IDE) 和持續(xù)集成(CI) 流水,這些流水在更改提交到代碼庫(kù)后,就能對(duì)代碼進(jìn)行測(cè)試。為了尋求針對(duì)上述許多此類需求的一種答案,CMake便由此孕育而生。即是Cmake是抱著如此“崇高”的初衷隆重登場(chǎng),但是很多接觸CMake的初學(xué)者、技術(shù)人員和Cpp開(kāi)發(fā)人員對(duì)其評(píng)價(jià)很不好甚至有些嗤之以鼻,確實(shí),毋庸置疑的一點(diǎn)是使用CMake語(yǔ)言和工具要正確配置和使用源碼需要一(ju)定(da)的工作量,但造成這些“操蛋”的爆肝工作量背后,并不是因?yàn)镃Make 復(fù)雜,而是因?yàn)椤白詣?dòng)化”的需求很復(fù)雜。拋開(kāi)一切,單單就論“做出一個(gè)真正模塊化的、功能強(qiáng)大的C++ 構(gòu)建應(yīng)用”以滿足各種需求的難度,這個(gè)應(yīng)該是很難吧?但是CMake 確實(shí)做到了(doge)。
兩個(gè)概念需要區(qū)分:<build tree> 和<source tree>,分別對(duì)應(yīng)構(gòu)建樹(shù)和源碼樹(shù);構(gòu)建樹(shù)是目標(biāo)/輸出目錄的路徑,源碼樹(shù)是源碼所在的路徑。
構(gòu)建軟件是一個(gè)通用的過(guò)程:編譯可執(zhí)行程序和庫(kù)、管理依賴關(guān)系、測(cè)試、安裝、打包、生成文檔和測(cè)試更多功能,當(dāng)然了上述其中有一些步驟是可以跳過(guò)的,但至少我們需要使用CMake完成編譯可執(zhí)行程序。目前,CMake 的開(kāi)發(fā)很活躍,并已成為C 和C++ 開(kāi)發(fā)人員的行業(yè)標(biāo)準(zhǔn)。以自動(dòng)化的方式構(gòu)建代碼的問(wèn)題比CMake 出現(xiàn)的要早得多,所以會(huì)有很多選擇:Make、Autotools、SCons、Ninja、Premake 等。但為什么CMake 可以后來(lái)居上呢?關(guān)于CMake,Rafa? ?widziński持有以下幾個(gè)重要觀點(diǎn):
? 專注于支持現(xiàn)代編譯器和工具鏈。
? CMake 是真正的跨平臺(tái)——支持Windows、Linux、macOS 和Cygwin 的構(gòu)建。
? 為主流IDE 生成項(xiàng)目文件:Microsoft Visual Studio, Xcode 和Eclipse CDT。此外,也是其他項(xiàng)目的模型,如CLion。
? CMake 操作在合適的抽象級(jí)別上——允許將文件分組到可重用的目標(biāo)和項(xiàng)目中。
? 有很多用CMake 構(gòu)建的項(xiàng)目,其提供了一種簡(jiǎn)單的方法將它們包含到自己的項(xiàng)目中。
? CMake 將測(cè)試、打包和安裝視為構(gòu)建過(guò)程的固有組成。
? 棄用舊的、未使用的特性,從而保持CMake 的精簡(jiǎn)。CMake 提供了統(tǒng)一的、流線型的體驗(yàn)。不管是在IDE 中構(gòu)建,還是直接從命令行構(gòu)建,還照顧到構(gòu)建后階段。即使前面所有的環(huán)境都不同,持續(xù)集成/持續(xù)部署(CI/CD) 流水也可以輕松地使用相同的CMake 配置,并使用單一標(biāo)準(zhǔn)構(gòu)建項(xiàng)目。
1.3 CMake在“暗地里”是怎么工作的?
由于文章較長(zhǎng),詳情可查看原文。
來(lái)源:微信公眾號(hào)「3D視覺(jué)工坊」? ?
本文僅做學(xué)術(shù)分享,如有侵權(quán),請(qǐng)聯(lián)系刪文。
3D視覺(jué)工坊精品課程官網(wǎng):3dcver.com
1.面向自動(dòng)駕駛領(lǐng)域的3D點(diǎn)云目標(biāo)檢測(cè)全棧學(xué)習(xí)路線!(單模態(tài)+多模態(tài)/數(shù)據(jù)+代碼)
2.徹底搞透視覺(jué)三維重建:原理剖析、代碼講解、及優(yōu)化改進(jìn)
3.國(guó)內(nèi)首個(gè)面向工業(yè)級(jí)實(shí)戰(zhàn)的點(diǎn)云處理課程
4.激光-視覺(jué)-IMU-GPS融合SLAM算法梳理和代碼講解
5.徹底搞懂視覺(jué)-慣性SLAM:基于VINS-Fusion正式開(kāi)課啦
6.徹底搞懂基于LOAM框架的3D激光SLAM: 源碼剖析到算法優(yōu)化
7.徹底剖析室內(nèi)、室外激光SLAM關(guān)鍵算法原理、代碼和實(shí)戰(zhàn)(cartographer+LOAM +LIO-SAM)
8.從零搭建一套結(jié)構(gòu)光3D重建系統(tǒng)[理論+源碼+實(shí)踐]
9.單目深度估計(jì)方法:算法梳理與代碼實(shí)現(xiàn)
10.自動(dòng)駕駛中的深度學(xué)習(xí)模型部署實(shí)戰(zhàn)
11.相機(jī)模型與標(biāo)定(單目+雙目+魚(yú)眼)
12.重磅!四旋翼飛行器:算法與實(shí)戰(zhàn)
13.ROS2從入門到精通:理論與實(shí)戰(zhàn)
14.國(guó)內(nèi)首個(gè)3D缺陷檢測(cè)教程:理論、源碼與實(shí)戰(zhàn)
15.基于Open3D的點(diǎn)云處理入門與實(shí)戰(zhàn)教程
16.透徹理解視覺(jué)ORB-SLAM3:理論基礎(chǔ)+代碼解析+算法改進(jìn)
17.不斷更新中......
重磅!粉絲學(xué)習(xí)交流群已成立
交流群主要有3D視覺(jué)、CV&深度學(xué)習(xí)、SLAM、三維重建、點(diǎn)云后處理、自動(dòng)駕駛、多傳感器融合、CV入門、三維測(cè)量、VR/AR、3D人臉識(shí)別、醫(yī)療影像、缺陷檢測(cè)、行人重識(shí)別、目標(biāo)跟蹤、視覺(jué)產(chǎn)品落地、視覺(jué)競(jìng)賽、車牌識(shí)別、硬件選型、ORB-SLAM系列源碼交流、深度估計(jì)、TOF、求職交流等方向。
添加小助理微信(dddvisiona),一定要備注:研究方向+學(xué)校/公司+昵稱,例如:”3D視覺(jué) + 上海交大 + 靜靜“。請(qǐng)按照格式備注,可快速通過(guò)且邀請(qǐng)進(jìn)群。? ? ? ? ? ? ?