cmake使用笔记
一.設置cmake版本:CMAKE_MINIMUM_REQUIRED (VERSION 2.8),根據當前cmake版本設置,版本一般不低于2.8;
二.cmake中預定義的一些變量:
PROJECT_SOURCE_DIR、CMAKE_SOURCE_DIR、_SOURCE_DIR、CMAKE_CURRENT_SOURCE_DIR :?工程的根目錄
CMAKE_SYSTEM_NAME:即目標機target所在的操作系統名稱,比如ARM或者Linux你就需要寫”Linux”,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 如果Android平臺你就寫”Android”,如果你的嵌入式平臺沒有相關OS你即需要寫成”Generic”.
CMAKE_C_COMPILER :??即C語言編譯器,這里可以將變量設置成完整路徑或者文件名
CMAKE_CXX_COMPILER :?C++編譯器;
CMAKE_MODULE_PATH :?這個變量用來定義自己的 cmake 模塊所在的路徑。如果你的工程比較復雜,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?有可能會自己編寫一些 cmake 模塊;
CMAKE_AUTORCC:是否為Qt目標自動處理rcc;
CMAKE_AUTOMOC :指定CMake是否會自動處理Qt moc預處理器;
CMAKE_CURRENT_BINARY_DIR:當前正在處理的二進制目錄路徑;
CMAKE_INCLUDE_CURRENT_DIR:自動添加 CMAKE_CURRENT_BINARY_DIR 和 CMAKE_CURRENT_SOURCE_DIR
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 到?當前處理的 CMakeLists.txt;
CMAKE_CXX_FLAGS :設置C++編譯選項;
CMAKE_BUILD_TYPE :可以的取值是 Debug Release RelWithDebInfo 和 MinSizeRel。當這個變量值為 Debug 的時
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?候,CMake 會使用變量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG 中的
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?字符串作為編譯選項生成 Makefile ,當這個變量值為 Release 的時候,工程會使用變量? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CMAKE_CXX_FLAGS_RELEASE 和 CMAKE_C_FLAGS_RELEASE 選項生成 Makefile;
三.cmake常用命令:
1.基本語法:
cmake變量使用${}方式取值,但是在IF控制語句中是直接使用變量名;
環境變量使用$ENV{}方式取值,使用SET(VALUE? $ENV{VAR})賦值;
指令(參數1 參數2…)??參數使用括弧括起,參數之間使用空格或分號分開;
指令是大小寫無關的,參數和變量是大小寫相關的。推薦你全部使用大寫指令。
2.部分常用命令列表:
(1)PROJECT: PROJECT(projectname [CXX] [C] [Java])
?指定工程名稱,并可指定工程支持的語言。支持語言列表可忽略,默認支持所有語言;
(2)SET:SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
定義變量(可以定義多個VALUE,如SET(SRC_LIST main.c util.c reactor.c))
(3)FIND_PACKAGE:用來調用預定義在CMAKE_MODULE_PATH下的Find<name>.cmake模塊,你也可以自己定義? ? ? ? ? ? ? ? Find<name>模塊,通過SET(CMAKE_MODULE_PATH dir)將其放入工程的某個目錄供工程使用
(4)INCLUDE_DIRECTORIES:向工程添加多個特定的頭文件搜索路徑,路徑之間用空格分隔,如果路徑包含空格,可以使用雙引號將它括起來,默認的行為為追加到當前頭文件搜索路徑的后面;
(5)LINK_DIRECTORIES:添加非標準的共享庫搜索路徑;
(6)ADD_SUBDIRECTORY:向當前工程添加存放源文件的子目錄,并可以指定中間二進制和目標二進制的存放位置;
(7)ADD_EXECUTABLE(bin_file_name ${SRC_LIST}):生成可執行文件;
(8)TARGET_LINK_LIBRARIES:為target添加需要鏈接的共享庫;
(9)-DCMAKE_BUILD_TYPE=Release : 編譯release版本;
3.其他重要語法:
(1)FILE:FILE(GLOB_RECURSE head_list "*.h*") 這個命令將把該目錄下及所有子文件夾內的所有后綴為.h的文件的路徑,? ?全部放入head_list 這個變量中。
(2)string(REGEX REPLACE <regular_expression> <replace_expression> <output variable> <input> [<input>...]):?REGEX REPLACE : 盡可能多次地匹配正則表達式,并且將匹配的值用replacement expression 替換掉,然后存儲到輸出變量中。這個replace expression 可以引用包含匹配字符串的子表達式,這些匹配的字符串用圓括號隔開的\1,\2,...,\9等加以引用。注意:在CMake代碼里,如果要使用一個反斜杠,必須要用兩個反斜杠(\\1)轉義,才能通過參數解析。
(3)LIST(APPEND ADPT_INC_LIST ${hd_path}):添加新element到list中;
? ?LIST(REMOVE_DUPLICATES ADPT_INC_LIST) :刪除ADPT_INC_LIST重復的文件;
(4)IF語法:
IF (expression), expression不為:空,0,N,NO,OFF,FALSE,NOTFOUND或<var>_NOTFOUND,為真
IF (not exp), 與上面相反
IF (var1 AND var2)
IF (var1 OR var2)
IF (COMMAND cmd) 如果cmd確實是命令并可調用,為真
IF (EXISTS dir) IF (EXISTS file) 如果目錄或文件存在,為真
IF (file1 IS_NEWER_THAN file2),當file1比file2新,或file1/file2中有一個不存在時為真,文件名需使用全路徑
IF (IS_DIRECTORY dir) 當dir是目錄時,為真
IF (DEFINED var) 如果變量被定義,為真
IF (var MATCHES regex) 此處var可以用var名,也可以用${var}
IF (string MATCHES regex)
數字比較表達式
IF (variable LESS number)
IF (string LESS number)
IF (variable GREATER number)
IF (string GREATER number)
IF (variable EQUAL number)
IF (string EQUAL number)
按照字母表順序進行比較
IF (variable STRLESS string)
IF (string STRLESS string)
IF (variable STRGREATER string)
IF (string STRGREATER string)
IF (variable STREQUAL string)
IF (string STREQUAL string)
(5)FOREACH語法:
a.列表法:
FOREACH(loop_var arg1 arg2 ...)COMMAND1(ARGS ...)COMMAND2(ARGS ...)... ENDFOREACH(loop_var)// 例子AUX_SOURCE_DIRECTORY(. SRC_LIST) FOREACH(F ${SRC_LIST})MESSAGE(${F}) ENDFOREACH(F)b.范圍法:
FOREACH(loop_var RANGE total)COMMAND1(ARGS ...)COMMAND2(ARGS ...)... ENDFOREACH(loop_var)// 例子從0到total以1為步進 FOREACH(VAR RANGE 10)MESSAGE(${VAR}) ENDFOREACH(VAR) 輸出: 012345678910c.范圍加步進法:
FOREACH(loop_var RANGE start stop [step])COMMAND1(ARGS ...)COMMAND2(ARGS ...)... ENDFOREACH(loop_var)//從start開始到stop結束,以step為步進, //注意:直到遇到ENDFOREACH指令,整個語句塊才會得到真正的執行。 FOREACH(A RANGE 5 15 3)MESSAGE(${A}) ENDFOREACH(A)//輸出: //581114參考鏈接:https://blog.csdn.net/wzzfeitian/article/details/40963457
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
- 上一篇: C++强制类型转换:static_cas
- 下一篇: uboot添加自定义命令