cmake是個很方便的構建系統。官方的文件寫的很明白,就是有點長。於是,根據自己的使用情況,挑選其中最重要的,簡要說明於下:
cmakelists.txt的編寫
cmakelists.txt的命令不區分大小寫。
基本結構
# 最低版本宣告,如果本機的cmake版本小於這個,會告警
cmake_minimum_required(version 3.10)
# set the project name
project(tutorial)
# add the executable
add_executable(tutorial tutorial.cxx)
# 生成庫
# add_library( mymath static mymath.cpp)
注:add_executable和add_library可以原始碼列表,原始碼檔案可以在後面通過target_sources新增。因為target_***_***的命令要求target先定義好,所以這一功能挺重要。
子目錄新增子目錄前,需要先為子目錄編寫cmakelists.txt。
add_subdirectory( mathfunctions )
依賴庫指定路徑
link_directories(tutorial "$/lib" )
注:link_directories只對在它後面宣告的target有效。
指定庫target_link_libraries支援多種格式,以libopus.a為例
target_link_libraries(tutorial opus)
target_link_libraries(tutorial -lopus)
target_link_libraries(tutorial libopus.a)
# 全路徑
target_link_libraries(tutorial $/lib/libopus.a)
如果不是全路徑模式,需要先指定路徑。
注:target_link_libraries加入的順序非常重要。比如tutorial依賴liba.a, liba.a依賴libb.a。那麼liba.a需要放在libb.a之前,不然會報錯,說libb.a的符號找不到。據說是有乙個選項,會盡量去掉沒使用的符號。如果先寫libb.a,則鏈結libb.a時發現沒有人在使用它,就把它去掉了。不過是啥選項沒研究,預設行為,還是注意下順序吧。
巨集定義target_compile_definitions(foo public foo)
target_compile_definitions(foo public -dfoo) # -d removed
target_compile_definitions(foo public "" foo) # "" ignored
target_compile_definitions(foo public -d foo) # -d becomes "", then ignored
#定義帶值的
target_compile_definitions( tutorial private "log_level=2" )
設定變數
#直接設定
set(lib_src src/mymath.cpp src/myadd.cpp ...)
#在原值後面增加
set(lib_src "$" src/mymath.cpp src/myadd.cpp ...)
編譯選項
#c,c++都啟用的編譯選項
add_compile_options(-wall -wextra -pedantic -werror)
add_compile_options(-g)
#設定c編譯選項
set(cmake_c_flags "$ -wall -os -g)
#設定c++編譯選項
set(cmake_cxx_flags "$" -std=c++11 -wall -os -g)
條件生成
if(win32)
***elseif(android)
***elseif(ios)
***endif
target的生成位址
set(cmake_library_output_directory $)
set(cmake_archive_output_directory $)
增加install
install( targets tutorial destination bin)
#安裝標頭檔案
install( files $/config.h destination include )
有了這個以後,就可以用make install安裝了
列印資訊
寫了cmakelists.txt,卻不能正常工作的時候,你一定想列印一些資訊,看看到底是哪兒錯了。於是message命令就派上了用場:
message("build lib ok !")
message( "use_mymath:$")
cmake命令
預設情況
cmake 原始碼目錄
make
傳遞引數
-d表示設定變數
-u表示取消變數
cmake -dcmake_install_prefix=/opt/the/prefix
-umypackage_dir
生成xcode或者vs專案
#xcode專案
cmake ./src -gxcode
#vs專案
cmake ./src -g"visual studio 12 2013"
CMake 常用巨集分享
在本人多年的cmake使用過程中,有兩個自定義巨集被廣泛且頻繁使用。分別是 根據專案目錄結構,分組顯示c 檔案,實現目錄結構與專案結構的對應。macro group files macro group files src files root path set cur dir foreach gro...
cmake中巨集的使用
首先貼乙個例子進行分析 set var abc macro moo arg message arg set arg abc message after change the value of arg.message arg endmacro message call macro moo 這段使用cm...
CMake系列教程1 初始CMake
cmake 是乙個跨平台的安裝 編譯 工具,可以用簡單 統一的語句來描述所有平台的安裝或編譯過程。能夠輸出不同編譯器的 makefile 或 project 檔案。cmake 的使用 cmakelists.txt 作為專案組織檔案,cmake 並非跨平台編譯工具,而是專案構建工具,可以在不同的平台上...