一起學習CMake 03

2021-06-16 11:55:56 字數 4287 閱讀 7764

乙個團隊共同開發軟體時,一般都是分模組進行作業的,每個人負責整個軟體中的一部分,然後再整合成乙個完整的軟體系統。具體的做法一般是某個人開發的東西是以鏈結庫的形式供團隊中的其他人進行呼叫,或者供本人負責的程式的其他模組進行呼叫。

比如,a童鞋開發了一種演算法,能做數a與數b的加法運算,a童鞋把它編譯成lib庫的形式給b童鞋呼叫,提供給b童鞋的就只有該加法運算的標頭檔案(讓b童鞋知道這個函式的介面是怎麼樣的)以及相應的函式實現lib庫檔案,b童鞋拿到了這兩個檔案以後,就可以在自己的程式裡面直接呼叫a童鞋的加法運算。

當涉及到大型的軟體開發專案時,這種鏈結庫的形式普遍存在,檔案少則幾十上百,多則成千上萬,這個時候就需要乙個工具來對這些鏈結庫進行管理,個人覺得cmake就是乙個最好的選擇。有用過vtk,itk等開源工具包的童鞋應該都知道,vtk等編譯完了以後會產生好多lib檔案,比如vtkcommon.lib, vtkfiltering.lib, vtkgenericfiltering.lib, vtkgraphics.lib, vtkhybrid.lib, vtkimaging.lib, vtkio.lib……等,而且好多剛學vtk的童鞋在編譯鏈結vtk工程時會經常碰到類似「***無法解析的外部命令」,「***.h找不到」等等這樣的錯誤。如果你是用cmake來構建工程的話,相信這些問題都是小菜一碟而已,所以了解一點cmake的知識對你使用那些開源工具包是灰常有幫助的。

跟《一起學習cmake - 02》一樣,在cmake-study目錄下再建乙個空的資料夾,就叫hellocmake3吧(在我機子上完整路徑是:d:\cmake\cmake-study\hellocmake3),然後把hellocmake2裡的檔案都copy到這個新建資料夾裡去,等下我們就在這個基礎上進行更改。接著在hellocmake3目錄下再建乙個新的資料夾,等下裡面會存放我們自己要實現lib的檔案,簡單起見,我們就做乙個加法運算可以了,資料夾就起名:addfunction。接著在addfunction裡新建兩個檔案,分別是addfunction.h和addfunction.cpp,什麼作用應該不用再解釋了。

addfunction.h的**如下: //

做整數的加法運算

intaddfunction(int

x,int

y);addfunction.cpp裡的**如下:

#include

intaddfunction(int

x,int

y)/hellocmakeconfig.h.in"

"$/hellocmakeconfig.h" )

include_directories ("$")

#

是否載入

addfunction

庫檔案?

圖(1)

具體到這個例子就是增加選項」use_addfunction」;第二個引數」user our add function」是標註資訊,也就是當你的滑鼠停留在cmake gui的」use_addfunction」選項上是會有提示資訊出現;第三個引數就是這個選項的值,預設是on,也就是使用我們自己的加法庫。如果更改了這些值,然後用cmake進行configure, generate時,這些選項的值會儲存在你在」where to build the binaries」指定的編譯目錄裡的cmakecache.txt檔案裡。當你再次開啟cmake時,cmake會自動去讀取cmakecache.txt檔案裡的各個選項的值。

再看看if/endif語句塊,它的作用就是根據使用者的選擇(即use_addfunction的值)來決定是否要包含子目錄addfunction(include_directories/add_subdirectory兩行**)到頭檔案的搜尋路徑中去;以及設定變數extra_libs的值為addfunction.lib(set一行**)。set命令是cmake裡用於設定變數值的乙個命令,使用頻率灰常高。還有,if/endif語句塊必須要成對出現,if和endif後面所帶的引數也必須一致。

target_link_libraries

命令也是用得灰常多的乙個命令,它的作用就是把$這個變數裡的庫檔案鏈結到hellocmake這個工程裡去。$是取某個變數的值的意思。

最外層的cmakelists.txt內容介紹完,接著看看hellocmakeconfig.h.in裡要新增什麼東西?在該檔案的最後加入如下**:

#cmakedefine use_addfunction

這行**是告訴cmake在生成hellocmakeconfig.h檔案時用」#define use_addfunction」或者」/*#undef use_addfunction*/」來代替」 #cmakedefine use_addfunction」,到底是前者還是後者,取決於use_addfunction選項的值(on還是off)。編譯完hellocmake這個工程以後,開啟hellocmakeconfig.h看看就知道怎麼回事了。

接著來看看hellocmake.cpp檔案,完整**如下:

#include

#include

"hellocmakeconfig.h"

#ifdef

use_addfunction

#include

"addfunction.h"

#endif

intmain(int

argc,char *argv)

{std::cout

<

軟體的主版本號是:"

<< hellocmake_version_major

<<:endl>

std::cout

<

軟體的次版本號是:"

<< hellocmake_version_minor

<<:endl>

fprintf(stdout,"%s version is: %d.%d\n",

argv[0],

hellocmake_version_major,

hellocmake_version_minor);

std::cout

<

<<:endl>

int

a, b;

std::cin>>a>>b;

#ifdef

use_addfunction

int

addresult = addfunction(a,b);

#else

int  addresult = a + b;

#endif

return 0;

增加的**都粗體字顯示,這些**都比較簡單,一看就能明白了,這裡就不多作介紹。有了這些檔案以後,走一遍cmake(configure, generate),整個工程也就構建完成了。

我們來看看到底發生了哪些變數,有圖有真相,看圖吧:

圖(2)

圖(3)

圖(4)

知道了這些東西,以後你在使用vtk, itk等工具包時,再碰到類似前文提到的錯誤時,也就知道怎麼回事了吧?下一節我們結合vtk等工具包來看看怎麼鏈結vtk裡的庫檔案到自己的工程裡去。

**

一起學習CMake 01

本節介紹cmake裡最常用的三個命令,分別是cmake minimum required project add executable等。cmake是個好東西,在使用vtk,itk,igstk,opencv,dcmtk等開源工具包時,是離不開cmake的,甚至有時你使用 fltk qt等介面開發工具...

開源一起學習

要想自己學習機器學習,3本 聖經 是一定要看的 花書,西瓜書,和統計學習方法 但不是剛入門就要看的,首先啊,我們必須學好學校教的c語言,對程式設計有乙個初步的了解,其次,我們都知道python的厲害,可以幹很多事,也很出名,這就出現了人人都知道py,但不是人人都懂py的現象。確實要想搞機器學習,你最...

一起學習extjs( )

可以說,extjs是系統類專案最好的ui 前端使用者介面 選擇,特別是自從extjs4.0出來後,不管是 美觀還是效能的提高,及其功能之強大,說它排第一,無可厚非。當然,最近也蠻流行easyui這個輕量級的,據說是國人開發的ui。其實,也是很不錯的。大家可以根據自己專案的情況來進行選擇。然後,我們自...