- 1、跨平台开发
- 2、语法特性介绍
- 3、重要指令和 CMake 常用变量
- 3.1、重要指令
- 3.2、CMake 常用变量
学习笔记来自于 基于VSCode和CMake进行C/C++开发「第六讲」CMake。
简介:
- CMake 是一个跨平台的安装编译工具,可以使用简单的语句来描述所有平台的安装(编译过程)。
- CMake 可以说是已经成为了大部分 C++ 开源项目的标配。
有一个跨平台项目,在不同的 系统/IDE 上共享 C++ 代码。 假设在 Windows 上使用 Visual Studio,在 Mac OS 上使用 Xcode,在 Linux 上使用 Makefile:
此时想要添加一个 bar.cpp 的文件,为了保证环境的一致性,必须需要在每个 IDE 中进行添加,这样的操作必然繁琐,容易出错,且不灵活:
现在可以使用 CMake 编写CMakefile.txt,这样来完成跨平台的 CMake 代码:
现在只需要一步就能添加新文件 bar.cpp:
2、语法特性介绍
1)基本语法格式:指令(参数1 参数2…)
- 参数使用括弧括起来
- 参数之间使用空格或分号分开
2)指令是不区分大小写的,参数和变量需要区分大小写
# 参数和遍历需要区分大小写,变量 HELLO 使用的是大写
set(HELLO hello.cpp)
# 指令不区分大小写 add_executable 与 ADD_EXECUTABLE
add_executable(hello main.cpp hello.cpp)
ADD_EXECUTABLE(hello main.cpp ${HELLO})
3)使用变量${}方式取值,但是在 IF 控制语句中是直接使用变量名的
3、重要指令和 CMake 常用变量 3.1、重要指令
1)cmake_minimum_required - 指定 CMake 的最小版本要求
- 语法:cmake_minimum_required(VERSION versionNumber [FATAL_ERROR])
# CMake最小版本要求为2.8.3 cmake_minimum_required(VERSION 2.8.3)
2)project - 定义工程名称,并可指定工程支持的语言
- 语法:project(projectname [CXX] [C] [Java])
# 指定工程名为 HelloWorld project(HelloWorld)
3)set - 显式的定义变量
- 语法:set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
# 定义 SRC 变量,其值为 main.cpp hello.cpp set(SRC sayhello.cpp hello.cpp)
3)include_directories - 向工程添加多个特定的头文件搜索路径 —>相当于指定 g++ 编译器的 -I 参数
- 语法:include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)
# 将/usr/include/myincludefolder 和 ./include 添加到头文件搜索路径 include_directories(/usr/include/myincludefolder ./include)
4)link_directories - 向工程添加多个特定的库文件搜索路径 —>相当于指定 g++ 编译器的 -L 参数
- 语法:link_directories(dir1 dir2 …)
# 将/usr/lib/mylibfolder 和 ./lib 添加到库文件搜索路径 link_directories(/usr/lib/mylibfolder ./lib)
5)add_library - 生成库文件
- 语法:add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)
# 通过变量 SRC 生成 libhello.so 共享库
add_library(hello SHARED ${SRC})
6)add_compile_options - 添加编译参数
- 语法:add_compile_options(编译参数)
# 添加编译参数 -Wall -std=c++11 add_compile_options(-Wall -std=c++11 -O2)
7)add_executable - 生成可执行文件
- 语法:add_executable(生成的文件名 main.cpp)
# 编译 main.cpp 生成可执行文件 main add_executable(main main.cpp)
8)target_link_libraries - 为 target 添加需要链接的共享库 —>相同于指定 g++ 编译器-l参数
- 语法:target_link_libraries(target library1library2…)
# 将 hello 动态库文件链接到可执行文件 main target_link_libraries(main hello)
9)add_subdirectory - 向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置
- 语法:add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
# 添加 src 子目录,src 中需有一个 CMakeLists.txt add_subdirectory(src)
10)aux_source_directory - 发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表
- 语法:aux_source_directory(dir VARIABLE)
# 定义 SRC 变量,其值为当前目录下所有的源代码文件
aux_source_directory(. SRC)
# 编译 SRC 变量所代表的源代码文件,生成 main 可执行文件
add_executable(main ${SRC})
3.2、CMake 常用变量
1)CMAKE_C_FLAGS gcc编译选项;CMAKE_CXX_FLAGS g++编译选项
# 在CMAKE_CXX_FLAGS编译选项后追加-std=c++11
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
2、CMAKE_BUILD_TYPE 编译类型(Debug, Release)
# 设定编译类型为debug,调试时需要选择debug set(CMAKE_BUILD_TYPE Debug) # 设定编译类型为release,发布时需要选择release set(CMAKE_BUILD_TYPE Release)
3)CMAKE_BINARY_DIR;PROJECT_BINARY_DIR;
这三个变量指代的内容是一致的。如果是 in source build,指的就是工程顶层目录;如果是 out-of-source 编译,指的是工程编译发生的目录;PROJECT_BINARY_DIR 跟其他指令稍有区别,不过现在,你可以理解为他们是一致的。
4)CMAKE_SOURCE_DIR;PROJECT_SOURCE_DIR;
这三个变量指代的内容是一致的,不论采用何种编译方式,都是工程顶层目录;也就是在 in source build时,他跟 CMAKE_BINARY_DIR 等变量一致;PROJECT_SOURCE_DIR 跟其他指令稍有区别,现在,你可以理解为他们是一致的。
5)CMAKE_C_COMPILER:指定C编译器
6)CMAKE_CXX_COMPILER:指定C++编译器
7)EXECUTABLE_OUTPUT_PATH:可执行文件输出的存放路径
8)LIBRARY_OUTPUT_PATH:库文件输出的存放路径



