cmake 是乙個高效的 c/c++ makefile 生成工具,具有很好的跨平台性。利用它可以讓**在各個平台上順利的編譯。
現在最願意看到的編譯流程就是:
mkdir build
cd build
cmake ..
make
這裡可能不是詳盡的解釋,但是展示了我本人在編寫中常用的命令。 利用 cmake 的契機主要是想要擺脫 xcode 以及使用 clion。當然,也是為自己的一些小專案做管理。(主要是不想寫 makefile)
cmakelist.txt
是 cmake 的核心檔案,所有對 cmake 的編輯配置都集中於此。所以,使用 cmake 來管理你的專案核心就在如何編寫cmakelists.txt
。 具體參考教程可以檢視參考資料的第一條進行練習。
括號中的是可選項。
cmake_minimum_required(version 3.9)
指定 cmake 的最低版本,非必要,但是最好有,因為可能有相容性問題。
project( projectname )
指明cmakelists.txt
目錄是乙個專案,並且專案名為指定的名稱。clion 依靠此命令來識別專案。
set()
設定變數命令,類似**中的變數,可以設定成想要的字串。
find_package([required])
查詢庫的命令。
庫一般會有二進位制檔案以及標頭檔案兩個內容需要查詢。
此命令會以兩種模式尋找庫的資訊。一種以 module 模式查詢,該命令會從cmake_module_path
變數儲存的路徑(可以包含多個路徑,以 : 分隔)中查詢格式為find.cmake
的檔案,根據包名來載入對應的 cmake 檔案查詢對應的內容。具體路徑可以檢視cmake的查詢目錄結構。
如果載入完成,以下變數就會被設定為對應的查詢路徑:
_found
_include_dir
_libraries
如果上述模式沒有查詢成功,會進入 config 模式,會在提供的 path 中查詢config.cmake
或者.pc
來讀取配置。如果載入完成,同樣會設定上訴的三個變數。
當然還有更複雜的用法以及更多的變數設定,但是簡單實用的是上面三個。
find_package(pkgconfig required)
載入這個包會載入一些 cmake 命令,從而可以載入由 pkg-config 管理的庫。
載入這個庫後會引用三個命令可供使用:
pkg_search_module()
pkg_check_module()
pkg_get_variable()
主要討論pkg_search_module
: 用法如下:
pkg_search_module([比較符 版本號] ...)
可以同時查詢多個庫,繼續往後寫就行。
所有庫都找到以後,一下變數會被設定:
_found ... set to 1 if module(s) exist
_libraries ... only the libraries (without the '-l')
_link_libraries ... the libraries and their absolute paths
_library_dirs ... the paths of the libraries (without the '-l')
_ldflags ... all required linker flags
_ldflags_other ... all other linker flags
_include_dirs ... the '-i' preprocessor flags (without the '-i')
_cflags ... all required cflags
_cflags_other ... the other compiler flags
可以根據需要選用,用的比較多應該還是一下兩個:
_include_dirs ... the '-i' preprocessor flags (without the '-i')
_libraries ... only the libraries (without the '-l')
因為 mac 用 brew 安裝一些庫的時候有時並不會包含find***.cmake
,但是***.pc
是被正確設定了的。使用pkg-config --list-all
可以檢視是否成功安裝。
include_directories()
指定標頭檔案的搜尋路徑。外部路徑最好使用<>
引用,雖然使用""
也沒什麼問題,工程目錄的最好使用""
引用。
aux_source_directory()
該命令會搜尋該目錄下的所有原始檔,組織過後全都放在變數中。防止重複修改配置檔案的利器。
add_executable(...)
將多個原始檔編譯鏈結成乙個可執行檔案。這個目錄下的 cmake 檔案的主要目標,可以設定多個可執行檔案。根據需要進行編譯。
target_link_libraries()
將庫與可執行檔案進行鏈結。
add_subdirectory()
這種情況下,path 下也有乙個cmakelists.txt
來配置子目錄的行為,子目錄的配置會被載入並將相關的內容新增到當前的配置中。
add_library([static | shared | module] )
用法與add_executable
相似,不過根據需求可以選擇生成靜態庫還是共享庫還是模組。
下面是管理乙個小專案的 cmake 模板,可以根據自己的需求進行修改。如果專案更加複雜,cmake 也可像指令碼一樣使用迴圈判斷等功能。玩的開心
cmake_minimum_required(version 3.9)
project(template)
// find_package() 等等
// source dir
aux_source_directory(./src src)
// include path
include_directories(./include)
// cmake config
set(cmake_cxx_standard 11)
// add exec
add_executable($ $)
// link target
//target_link_libraries($ ...)
cmake 入門實戰www.hahack.com
find_package cmake docscmake.org
findpkgconfig - cmake 3.14.3 documentationcmake.org
CMAKE 預設標頭檔案路徑問題
如果在cmake配置中 include directories home ll home ll中的標頭檔案查詢優先順序高於系統預設目錄 usr include和 usr local include 即使增加 系統預設的搜尋標頭檔案的目錄隨選擇的c c 編譯器而變化 交叉編譯例項 cmake mini...
CMake學習 新增標頭檔案路徑,庫路徑,庫
cmake中,新增標頭檔案路徑,對應的函式叫include directories。然後在引數中,把所有需要新增的路徑,加進去就可以了。新增庫路徑,對應的函式叫link directories,同樣,在引數中,把所有的路徑加進去就可以了。cmake中的函式呼叫,是不區分大小寫的,大小寫可以混合使用。...
gcc指定標頭檔案路徑及動態鏈結庫路徑
include 直接到系統指定的某些目錄中去找某些標頭檔案。include 先到原始檔所在資料夾去找,然後再到系統指定的某些目錄中去找某些標頭檔案。1.會在預設情況下指定到 usr include資料夾 更深層次的是乙個相對路徑,gcc可執行程式的路徑是 usr bin gcc,那麼它在實際工作時指...