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)
输出:
012345678910

c.范围加步进法:

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值