CMake使用總結(2)
<keensword007@sina.com>
Abstract
本文總結了CMake在linux嵌入式系統項目開發中的應用
Table of Contents
- 前言
- 項目文件組織
- 常用的幾個內置變數
- 常用的命令
- 小結
- 參考書目
前言
在前面一篇文章中,我們從一個sample入手,了解了CMake的基本用法和語法。但這個例子與實際開發還有一段距離,主要存在以下幾點問題:
在本章,我們將sample程序逐步改造,解決上述問題。
項目文件組織一個項目,通常包含若干子模塊。比如上一篇的sample,我們可以認為它包含兩個子模塊,Hello為程序庫,Demo為主程序。很少有項目會把目標二進位文件和源程序放在一起的,通常會建立一個bin目錄,存放生成的二進位文件,發布程序則放在release。根據我在項目開發中的習慣,將目錄結構修改如下:
CMakeSample |--- release |--- doc |--- lib |--- source |--- include |--- bin |--- Hello |--- Demo
其中,release存放程序發布相關文件,包括程序文件、腳本、參數等。doc包含項目開發中的相關文檔,如設計說明以及通過doxgen等工具從代碼中生成的文檔。lib存放項目中使用的第三方庫,項目中自己編寫的庫不放在此目錄,應該作為項目的一個模塊放在source目錄下。include包含整個項目中使用的公共頭文件,如果子模塊中的頭文件僅在該子模塊類使用,不需放到include目錄。bin目錄存放編譯後的調試版本代碼。其它的子目錄則為各模塊的代碼及頭文件。
按照以上目錄結構,將Hello下的hello.h移到include目錄,因為這個頭文件被Demo模塊包含。這個sample中未使用第三方庫,所以暫時為空。
常用的幾個內置變數從上文中我們知道,通過set語句可以自定義變數,然而,CMake還包含大量的內置變數,這些變數和自定義變數的用法沒有區別,下面就列出一些常用的變數:
指定C編譯器,通常,CMake運行時能夠自動檢測C語言編譯器。進行嵌入式系統開發時,通常需要設置此變數,指定交叉編譯器。
指定C++編譯器
指定編譯C文件時編譯選項,比如-g指定產生調試信息。也可以通過add_definitions命令添加編譯選項。
指定可執行文件存放的路徑。
指定庫文件放置的路徑
常用的命令
除了內置變數,我們還可以通過命令來修改編譯選項,現將一些常用的命令列出來:
指定頭文件的搜索路徑,相當於指定gcc編譯器的-I參數
動態鏈接庫或靜態鏈接庫的搜索路徑,相當於指>定gcc的-L參數
包含子目錄,當工程包含多個子目錄時,此命令有用
添加編譯參數,比如add_definitions(-DDEBUG)將在gcc命令行添加DEBUG宏定義
編譯可執行程序
指定鏈接庫,相同於指定-l參數
小結本文經過修改目錄結構,指定編譯工具鏈,生成動態鏈接庫等動作,將前文的sample修改成一個比較接近實際工程的嵌入式環境。當然這個sample仍然只是一個自娛自樂的小玩意,但對於說明CMake用法已經足夠了,有了這些基本的CMake知識,在項目中使用CMake就成為可能了。當然不同的環境會遇到一些新問題,藉助於互聯網,沒有什麼解決不了的問題。趕快動手吧,拋棄手工編寫Makefile的痛苦,加入CMake使用者行列吧。 參考書目
Jan Engels. CMake Tutorial.
推薦閱讀:
※使用 CMake 不用路徑地調用 libclang
※解決 Windows 下 Python 安裝 Dlib 的問題:Cmake 找不到 boost
※macOS Sierra10.12.6下安裝OpenCV3.3.0
※如何安裝opencv_contrib及解決其安裝編譯問題
※Ubuntu下邊用邊學CMAKE(一)