cmake编译

CMake编译原理

CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object))。因此CMake的编译基本就两个步骤:

cmake
make

CMake常用build文件夹说明

一般把CMakeLists.txt文件放在工程目录下,使用时,先创建一个叫build的文件夹(这个并非必须,因为cmake命令指向CMakeLists.txt所在的目录,例如cmake . ., 表示CMakeLists.txt在当前目录的上一级目录。cmake后会生成很多编译的中间文件以及makefile文件,所以一般建议新建一个新的目录,专门用来编译),然后执行下列操作:

cd build
cmake . .
make

其中cmake . . 在build里生成Makefile,make根据生成makefile文件,编译程序,make应当在有Makefile的目录下,根据Makefile生成可执行程序或共享库。

CMakeLists.txt文件的编写

简单示例

# cmake 最低版本需求
cmake_minimum_required(VERSION 3.13)

# 工程名称
project(cmake_study)

# 设置
set(CMAKE_CXX_STANDARD 11)

# 编译源码生成目标
add_executable(cmake_study src/main.cc)
#src下方放的源文件

CMakeLists变量

SET(set) 来定义变量:

语法 :SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
指令功能 : 用来显式的定义变量
例子 : SET (SRC_LST main.c other.c)
说明: 用变量代替值,例子中定义 SRC_LST 代替后面的字符串。

我们可以使用 ${NAME} 来获取变量的名称

cmake 常用变量
cmake编译_第1张图片
cmake 系统信息
cmake编译_第2张图片
cmake 编译选项
cmake编译_第3张图片

CMake 常用指令

ADD_DEFINITIONS
ADD_DEPENDENCIES
AUX_SOURCE_DIRECTORY
ADD_SUBDIRECTORY
find_package
include_directories
link_libraries
ADD_EXECUTABLE
ADD_LIBRARY
ENABLE_TESTING
CMAKE_MINIMUM_REQUIRED
EXEC_PROGRAM
FILE 指令

CMake 控制指令

IF 指令

if(<condition>)
  <commands>
elseif(<condition>) # optional block, can be repeated
  <commands>
else()              # optional block
  <commands>
endif()

#####

IF(var),如果变量不是:空,0,N, NO, OFF, FALSE, NOTFOUND 或<var>_NOTFOUND 时,表达式为真。
IF(NOT var ),与上述条件相反。
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 dirname),当 dirname 是目录时,为真。
IF(variable MATCHES regex)
IF(string MATCHES regex)

FOREACH 指令

foreach(<loop_var> <items>)
  <commands>
endforeach()

WHILE 指令

while(<condition>)
  <commands>
endwhile()

具体使用可以看这个,例子很多,足够覆盖看懂大多数的场景了[参考]
参考

参考

你可能感兴趣的:(cmake,linux,c++)