5、cmake的简单认识及CMakeLists.txt的编写语法

文章目录

  • 1、cmake是什么
    • (1)cmake的两大功能
  • 2、CMakeLists.txt常用命令(即如何编写CMakeLists.txt文件)
    • (1)cmake常见预定义
      • 1)常见的预定义变量
      • 2)系统信息预定义变量
      • 3)开关选项
    • (2)常见语法
      • 1)CMAKE_MINIMUM_REQUIRED
      • 2)PROJECT(name)
      • 3)SET:向某个变量添加某些值
      • 4)ADD_SUBDIRECTORY
      • 5)INCLUDE_DIRECTORIES
      • 6))ADD_EXECUTABLE
      • 7)ADD_LIBRARY:添加库
      • 8)LINK_DIRECTORIES:用于添加外部库的搜索路径
      • 9)TARGET_LINK_LIBRARIES
      • 10)MESSAGE:向终端输出用户定义的信息或变量值
      • 11)AUX_SOURCE_DIRECTORY
    • (3)基本控制语法
      • 1)IF(一定要有ENDIF与IF对应)
      • 2)WHILE(一定要有ENDWHILE与WHILE对应)
      • 3)FOREACH(每个FOREACH都需要一个ENDFOREACH()与之匹配)

1、cmake是什么

CMake是一个跨平台的编译(Build)工具,可以用简单的语句来描述所有平台的编译过程。
CMake能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下automake

Cmake是用来makefile的一个工具:即读入所有源文件之后,自动生成makefile。
5、cmake的简单认识及CMakeLists.txt的编写语法_第1张图片

(1)cmake的两大功能

1)配置和生成各大平台的工程(vs的vcxproj,Qt的Pro):比如设置输出目录,设置编译对象的debug后缀,设置源码在工程中的那个文件夹(Filter),配置需要依赖的第三方的头文件目录,库目录等等属性

2)生成makefile文件:计算机编译源文件的时候是一条指令一条指令的发送给编译器执行的,这样效率很低下,所以就产生了一种文件,把所有的命令写到一个文件中,这个文件就是makefile。CMake生成了这个makeFile之后,各大平台的编译器都会拿到这个makeFile然后解析它。将他的命令解析出来一条一条执行。(在linux/Unix平台,生成makefile,在苹果平台可以生成Xcode,在windows平台,可以生成MSVC的工程文件)

2、CMakeLists.txt常用命令(即如何编写CMakeLists.txt文件)

在CMake中,大小写、甚至大小写混合的命令都是被支持的。

(1)cmake常见预定义

1)常见的预定义变量

PROJECT_SOURCE_DIR:工程根目录;
PROJECT_BINARY_DIR:运行cmake命令的目录。建议定义${PROJECT_SOURCE_DIR}/build下
CMAKE_INCLUDE_PATH:环境变量,非cmake变量;
CMAKE_LIBRARY_PATH:环境变量;
CMAKE_CURRENT_SOURCE_DIR:当前处理的CMakeLists.txt文件所在路径;
CMAKE_CURRENT_BINARY_DIR:target编译目录;
使用ADD_SURDIRECTORY指令可以更改该变量的值;
SET(EXECUTABLE_OUTPUT_PATH < dir >) 指令不会对该变量有影响,但改变了最终目标文件的存储路径;

CMAKE_CURRENT_LIST_FILE:输出调用该变量的CMakeLists.txt的完整路径;
CMAKE_CURRENT_LIST_LINE:输出该变量所在的行;
CMAKE_MODULE_PATH:定义自己的cmake模块所在路径;
EXECUTABLE_OUTPUT_PATH:重新定义目标二进制可执行文件的存放位置(使用set指令可对其进行设置)
LIBRARY_OUTPUT_PATH:重新定义目标链接库文件的存放位置;
PROJECT_NAME:返回由PROJECT指令定义的项目名称;
CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS:用来控制IF…ELSE…语句的书写方式;

2)系统信息预定义变量

CMAKE_MAJOR_VERSION cmake主版本号,如2.8.6中的2
CMAKE_MINOR_VERSION cmake次版本号,如2.8.6中的8
CMAKE_PATCH_VERSION cmake补丁等级,如2.8.6中的6
CMAKE_SYSTEM 系统名称,例如Linux-2.6.22
CMAKE_SYSTEM_NAME 不包含版本的系统名,如Linux
CMAKE_SYSTEM_VERSION 系统版本,如2.6.22
CMAKE_SYSTEM_PROCESSOR 处理器名称,如i686
UNIX 在所有的类UNIX平台为TRUE,包括OS X和cygwin
WIN32 在所有的win32平台为TRUE,包括cygwin

3)开关选项

BUILD_SHARED_LIBS 控制默认的库编译方式。如果未进行设置,使用ADD_LIBRARY时又没有指定库类型,默认编译生成的库都是静态库。
CMAKE_C_FLAGS 设置C编译选项
CMAKE_CXX_FLAGS 设置C++编译选项

(2)常见语法

1)CMAKE_MINIMUM_REQUIRED

该语句一般都可以放置在CMakeLists.txt的开头,用于说明CMake最低版本要求在这里插入图片描述

2)PROJECT(name)

该指令一般置于CMakeLists.txt的开头,定义了工程的名称name。但项目最终编译生成的可执行文件并不一定是这个项目名称,而是由另一条命令确定的
在这里插入图片描述

执行完这条指令后将会自动创建如上的两个变量(这时候前面简述的PROJECT_BINARY_DIR = < projectname >_BINARY_DIR,PROJECT_SOURCE_DIR = < projectname >_SOURCE_DIR)

a)内部构建与外部构建(在CMakeLists.txt所在目录下,有两种执行cmake的方法)
5、cmake的简单认识及CMakeLists.txt的编写语法_第2张图片
b)第一种方法是内部构建,第二种方法是外部构建。上述两种方法中,最大不同在于cmake与make的工作路径不同。

c)内部构建:cmake生成的中间文件和可执行文件都会存放在项目目录中

d)外部构建:中间文件与可执行文件都存放在build目录中

e)推荐使用外部构建的方法:能够最大限度的保持了代码目录的整洁,生成、编译与安装是不同于项目目录的其他目录中,在外部构建方法下,PROJECT_SOURCE_DIR指向目录与内部构建相同,为CMakeLists.txt所在根目录;而PROJECT_BINARY_DIR不同,它指向CMakeLists.txt所在根目录下的build目录

3)SET:向某个变量添加某些值

在这里插入图片描述

4)ADD_SUBDIRECTORY

用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置。
在这里插入图片描述

5)INCLUDE_DIRECTORIES

向工程添加多个特定的头文件搜索路径,路径之间用空格分隔。
在这里插入图片描述

6))ADD_EXECUTABLE

该命令给出源文件名称,并指出需要编译出的可执行文件名。
5、cmake的简单认识及CMakeLists.txt的编写语法_第3张图片

7)ADD_LIBRARY:添加库

5、cmake的简单认识及CMakeLists.txt的编写语法_第4张图片

8)LINK_DIRECTORIES:用于添加外部库的搜索路径

在这里插入图片描述

9)TARGET_LINK_LIBRARIES

指定链接目标文件时需要链接的外部库,效果类似于gcc编译参数-L,解决外部库依赖的问题。
在这里插入图片描述

10)MESSAGE:向终端输出用户定义的信息或变量值

5、cmake的简单认识及CMakeLists.txt的编写语法_第5张图片

11)AUX_SOURCE_DIRECTORY

查找某个路径下的所有源文件,并将源文件列表存储到一个变量中
在这里插入图片描述

(3)基本控制语法

1)IF(一定要有ENDIF与IF对应)

a)语法格式
5、cmake的简单认识及CMakeLists.txt的编写语法_第6张图片
b)基本用法
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) 当给定变量或字符串能匹配正则表达式regex时,为真;

2)WHILE(一定要有ENDWHILE与WHILE对应)

语法格式
5、cmake的简单认识及CMakeLists.txt的编写语法_第7张图片
判断条件语句参考IF

3)FOREACH(每个FOREACH都需要一个ENDFOREACH()与之匹配)

a)列表语法
5、cmake的简单认识及CMakeLists.txt的编写语法_第8张图片

b)范围语法
5、cmake的简单认识及CMakeLists.txt的编写语法_第9张图片

c)范围步进语法
5、cmake的简单认识及CMakeLists.txt的编写语法_第10张图片
参考链接:https://www.jianshu.com/p/9d246e4071d4

你可能感兴趣的:(C++,windows,linux,运维)