這篇文章提供了一個(gè)簡(jiǎn)潔易懂的 cmake 工程模板,可以滿足一個(gè)小團(tuán)隊(duì)的合作開(kāi)發(fā),無(wú)論是在代碼安全性,還是開(kāi)發(fā)效率上,都能滿足基本的開(kāi)發(fā)需求。
本文詳細(xì)描述了文件結(jié)構(gòu)和操作流程,如何在Linux系統(tǒng)使用命令行來(lái)編譯,如何在Windows系統(tǒng)中使用VSCode 和Visual Studio 2019來(lái)進(jìn)行開(kāi)發(fā)和編譯。
使用這個(gè)cmake模板之后,代碼的結(jié)構(gòu)非常的清晰,編譯過(guò)程中產(chǎn)生的中間文件也不會(huì)污染源代碼。
無(wú)論是開(kāi)發(fā)一些個(gè)人項(xiàng)目,或者是在一些小團(tuán)隊(duì)中使用是綽綽有余了。
示例代碼中核心的兩個(gè)文件就是:app.cmake和lib.cmake,幾乎每一行都有注釋。
文末有下載鏈接。
文件目錄說(shuō)明
在團(tuán)隊(duì)開(kāi)發(fā)工作中,每個(gè)人負(fù)責(zé)不同的模塊。
從代碼保密的角度看,除了項(xiàng)目負(fù)責(zé)人(或者說(shuō)項(xiàng)目整合人員)有權(quán)限獲取一個(gè)項(xiàng)目中的所有代碼之外,每個(gè)開(kāi)發(fā)者通常只擁有自己負(fù)責(zé)的模塊。
每個(gè)開(kāi)發(fā)者在編譯自己的模塊時(shí),需要把輸出文件(頭文件、庫(kù)文件、文檔)等,匯總到一個(gè)中央倉(cāng)庫(kù)中,方便整合人員進(jìn)行集成編譯。
因此,示例代碼如下圖所示:

CMakeLists.txt:是最外層的 cmake 文件;
install:是所有模塊編譯結(jié)果的安裝目錄,便于項(xiàng)目整合人員集成編譯;
myapp:是一個(gè)可執(zhí)行程序的模板;
mymath:是一個(gè)動(dòng)態(tài)鏈接庫(kù)的模板;
再來(lái)看一下mymath內(nèi)部的文件組織結(jié)構(gòu):

build:存放編譯過(guò)程中產(chǎn)生的中間文件,不會(huì)污染源代碼。當(dāng)然了,如果使用 git 來(lái)進(jìn)行版本管理,需要把這個(gè)目錄添加到 .gitignore 文件中;
lib.cmake:比較重要的 cmake 文件,這個(gè)模板的核心價(jià)值就在這個(gè)文件中;
source:存放源代碼,并且區(qū)分了 linux 和 windows 系統(tǒng),在不同的系統(tǒng)上編譯,會(huì)自動(dòng)編譯對(duì)應(yīng)目錄下的 C 文件;
include:存放頭文件;
myapp目錄內(nèi)部結(jié)構(gòu)與mymath幾乎是一樣的,這里就不贅述了。
這兩個(gè)模塊的編譯結(jié)果會(huì)自動(dòng)輸出到install目錄,如下圖所示:

在install目錄內(nèi):
include:匯總了所有模塊的頭文件;
library:匯總了所有模塊輸出的庫(kù)文件;
bin:匯總了所有的可執(zhí)行程序(一些單元測(cè)試程序根據(jù)自己的需要是否輸出此目錄);
操作:Linux系統(tǒng)下編譯
編譯動(dòng)態(tài)庫(kù)
刪除install下所有文件和目錄,得到一個(gè)干凈的目錄。
創(chuàng)建build目錄,存放中間文件:
$ cd demo_cmakemymath $ mkdir build
編譯
$ cd build $ cmake .. $ make
成功編譯后,在install目錄里可以看到編譯的輸出結(jié)果:
demo_cmakeinstallincludemymathmymath.h demo_cmakeinstalllibrarylinuxdebuglibmymath.so
編譯可執(zhí)行文件
$ cd demo_cmakemyapp $ mkdir build $ cd build $ cmake .. $ make
查看install目錄下的輸出結(jié)果:
demo_cmakeinstallinlinuxdebugmyapp
運(yùn)行可執(zhí)行程序
$ cd demo_cmakeinstallinlinuxdebug $ ./myapp
執(zhí)行結(jié)果如下圖:

Windows系統(tǒng)中使用VSCode開(kāi)發(fā)
創(chuàng)建MSVC工程
在VSCode IDE中,通過(guò)菜單【File】-【Open Folder】,打開(kāi)文件夾demo_cmake。
因?yàn)閐emo_cmake目錄下存在一個(gè)頂層CMakeLists.txt文件,所以VSCode偵測(cè)到之后會(huì)自動(dòng)進(jìn)行cmake配置,同時(shí)會(huì)創(chuàng)建目錄build來(lái)存放所有的中間文件。
有些VSCode版本會(huì)跳出一個(gè)提示窗,讓用戶選擇進(jìn)行cmake配置,如下一步中所示。
執(zhí)行cmake配置
可以同時(shí)按下:【ctrl】 + 【shift】 + 【p】,重新進(jìn)行cmake配置:

編譯動(dòng)態(tài)庫(kù)
同時(shí)按下【shift】+【F7】,(或者按下VSCode最下方 【Build】右側(cè)的編譯目標(biāo)),彈出窗口:

查看install目錄中的輸出文件:
demo_cmakeinstalllibrarywindowsdebugmymath.lib demo_cmakeinstallinwindowsdebugmymath.dll
編譯可執(zhí)行程序
同時(shí)按下【shift】+【F7】,選擇編譯myapp。
查看install目錄:
demo_cmakeinstallinwindowsdebugmyapp
雙擊運(yùn)行可執(zhí)行程序

Windows只用VS2019來(lái)開(kāi)發(fā)
生成VS2019解決方案
打開(kāi)命令行窗口: x64 Native Tools Command Prompt for VS 2019
> cd demo_cmake > md build > cd build > cmake ..
輸出如圖:

使用VS2019編譯動(dòng)態(tài)庫(kù)
此時(shí),可以看到解決方案:demo_cmakeuilddemo_cmake.sln。
使用VS2019打開(kāi)解決方案文件:

在工程mymath上單擊右鍵,選擇【重新生成】,在輸出信息區(qū)可以看到生成了文件:
demo_cmakeinstalllibrarywindowsdebugmymath.lib demo_cmakeinstallinwindowsdebugmymath.dll
編譯可執(zhí)行程序
在工程myapp上單擊右鍵,選擇【重新生成】。
在輸出信息區(qū)可以看到生成了文件:
demo_cmakeinstallinwindowsdebugmyapp.exe
運(yùn)行可執(zhí)行程序

------ End ------
我們知道,在Windows平臺(tái)上,VS2019只是一個(gè)IDE而已,它的底層是調(diào)用MSBuild來(lái)執(zhí)行編譯動(dòng)作的。
MSBuild的角色與cmake非常類(lèi)似,使用起來(lái)也比較方便,以后再總結(jié)一篇關(guān)于MSBuild的模板工程。
審核編輯:劉清
-
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
608瀏覽量
29501 -
Windows系統(tǒng)
+關(guān)注
關(guān)注
0文章
29瀏覽量
10104 -
vscode
+關(guān)注
關(guān)注
1文章
169瀏覽量
8914
原文標(biāo)題:分享一個(gè)適合【團(tuán)隊(duì)】開(kāi)發(fā)的cmake【跨平臺(tái)】工程模板
文章出處:【微信號(hào):IOT物聯(lián)網(wǎng)小鎮(zhèn),微信公眾號(hào):IOT物聯(lián)網(wǎng)小鎮(zhèn)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
沒(méi)有CySecureTools模塊,如何在Windows操作系統(tǒng)中使用mtb 3.2?
在Windows上使用VScode進(jìn)行編譯LED例程下載,串口下載報(bào)錯(cuò),如何切換芯片型號(hào)?
使用vscode進(jìn)行開(kāi)發(fā)
AN0130 AT32使用VSCode開(kāi)發(fā)
Windows系統(tǒng)VSCode+pyOCD開(kāi)發(fā)環(huán)境搭建步驟分享
在Windows上使用VScode進(jìn)行編譯LED例程下載,串口下載報(bào)錯(cuò)如何切換芯片型號(hào)?
如何在ARM上使用Clang for Windows進(jìn)行編譯
如何在結(jié)構(gòu)監(jiān)測(cè)系統(tǒng)中使用基于memzo的壓電礦車(chē)來(lái)填補(bǔ)電力缺口
如何在Microsoft Visual Studio 2015中使用英特爾C++編譯器
ESP32教程之如何在Windows系統(tǒng)上搭建開(kāi)發(fā)環(huán)境
VSCode搭建STM32單片機(jī)開(kāi)發(fā)環(huán)境
stm32cubeMX+vscode開(kāi)發(fā)編譯調(diào)試stm32程序
如何在vscode上面開(kāi)發(fā)stm32
如何在Windows中使用MTP協(xié)議
不借助Linux系統(tǒng),在Windows下如何搭建ZMC900E交叉編譯環(huán)境

如何在Windows系統(tǒng)中使用VSCode來(lái)進(jìn)行開(kāi)發(fā)和編譯
評(píng)論