CMake使用技巧

前面有提到使用CMake。不少朋友提到也用過一下,沒感受它有什麼好用,不知道怎麼用之類。
我必要來講明一下。windows

CMake的語法比較差,不是很優美,不是它不能用一個更好的語法,而是有一個關鍵優點:簡單。app

1.CMake當前這種仿C函數的語法基本上沒有學習的門階,不管是否理解CMake均可以讀懂。
2.當前CMAKE不能寫構建函數,if語句也比較難看,其實強烈傳遞了,你不該該這麼寫的,構建腳本不該這麼複雜的信號。函數

在CMake的文檔中並無說過,但我認爲,CMake的設計思路中是包括了:讓容易的事情簡單化,困難的事情能夠作。
讓每一個項目都須要作一遍的事情變得很簡單,好比添加多個編譯目標,它就很是簡單。特別是可執行程序+庫這種結構
就更簡單了。學習

但它能夠定製一些比較複雜,甚至困難的需求,好比使用多個指定framework,目標文件有不一樣的名字等等,但語法就不是
那麼優美,看起來像是打補丁的樣子。設計

因此另外一方面它的理念中約定優於配置的,須要配置的部分會比較難看。unix

適合的它約定的C++項目是什麼樣的呢?orm

項目的構建結果應該是可執行、動態庫、靜態庫和通常文件。若是須要生成內容或打包,就須要定製目標,會比較難看了。遞歸

C++編譯和鏈接選項應使用同一套,爲每一個目標定製,要使用target_xxx命令,會比較難看。rem

預編譯符號,應使用config.h,使用configure_file這條命令生成文檔

注意CMake雖然是生成其它IDE和構建腳本,但它的目標是構建,而不是使用,因此它生成的VS 工程並不美觀。若是是爲了
生成實用的工程文件,建議使用premake5。它能夠從一個腳本中生成vs2008-2017各版本的工程文件。

CMake對庫有一個很是好的定義,它能夠定義庫公開和私有的部分,同時也遞歸引用,即若是a->b->c這個結構,a只須要說明
引入b,不須要說明也依賴於c。這種狀況與Linux的so相同,但與exe文件徹底不一致,但能夠大大簡化程序的配置。

好比整個項目結構是app1, app2, app3, app4 -> platformlib -> utils1, utils2, utils3等等,通常來講app1,app2,app3都是須要鏈接
utils1/2/3,但在cmake中,只須要說明鏈接platformlib,cmake會幫助處理對utils1/2/3的鏈接關係。

對於第三方庫,CMake有兩種方案,全局性的,能夠直接加在includes/definitions/librarys中,直接向全部目標引入。只有部分目標
使用或者更優雅的方式。CMAKE提供了特別的目標支持,IMPORT類型,能夠爲第三方庫構建一個目標,把它統一放到整個構建樹的節點中
特別是它能夠定義INTERFACE_XXX屬性,這樣第三方庫的包含目錄,庫文件就只須要聲明一次。這就爲前文提到的第三方庫管理提供了基礎。

對於很是經常使用的第三方庫,例如boost,能夠經過find_packages引入,包括全局和預約義的import目標,也可能經過BOOST_ROOT變量指定
使用哪一個目錄下的boost庫。

對於部署部分,CMake主要按標準unix程序的方式提供make install選項,在windows下也可使用,但並不適合二進制發佈。但能夠簡單 提供一個dist前綴目錄,安裝到這個目錄下,再打包成二進制發佈。或者自定義一個目標,使用rpm/deb/nsis等生成二進制發佈包。

相關文章
相關標籤/搜索