一、CMake的前序
CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程),可以说已经成为大部分C++开源项目标配
CMake = C、C++(编译器指令gcc)+ 语法,可以搭建更加完善的NDK的环境,我们来从入门快速搭建属于自己的环境。
二、CMake的常用指令介绍
1、cmake_minimum_required - 指定CMake的最小版本要求
cmake_minimum_required(VERSION 3.20)
#CMake的最小的版本号为3.2.0
2、project - 定义工程名称,并可指定工程支持的语言
project(untitled3 CXX C Java)
#CMake默认支持所有语言,untitled3只支持C++(CXX) 、C 、JAVA三种语言
3、set - 显式的定义变量
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -O2")
#CMAKE_CXX_FLAGS 是系环境统变量,后续会介绍更多
# “$“ 代表拿到CMAKE_CXX_FLAGS变量的取值,然后于 -g -Wall -O2进行数值拼接
# ${CMAKE_CXX_FLAGS}拿到值为-std=c++14, 加上 -g -Wall -O2后,CMAKE_CXX_FLAGS系统环境变量为-std=c++14 -g -Wall -O2
# -g : 代表g++可以调试
# -Wall : 代表g++编译后有警告信息
# -O2 : 代表g++编译优化
# -std=c++14 : 代表C++编译环境是C++14的版本
4、add_compile_options - 添加编译参数
add_compile_options(-Wno-unused-value -Wno-unused-variable -Wno-missing-braces)
# 与set CMAKE_CXX_FLAGS 变量效果一样
5、include_directories - 向工程添加多个特定的头文件搜索路径
相当于指定g++编译器的-I参数
include_directories(${CMAKE_SOURCE_DIR}/include)
# CMAKE_SOURCE_DIR代表当前CMake的当前绝对路径,/Users/zhangsan/CLionProjects/untitled3后续会统一介绍系统环境变量,加上这个语法,再导入库只是导入相对路径而不是绝对路径
6、link_directories - 向工程添加多个特定的库文件搜索路径(用的较少)
7、add_subdirectory - 向当前工程添加存放源文件的子目录
添加子目录一定要有CMakeLists.txt文件
add_subdirectory(samples)
# 在第一个CMake(untitled3)添加第二个子编译目录(samples),这个也叫subModule模式
8、add_library - 预编译库
add_library(slib STATIC) : STATIC生成静态库,后缀名 .a
add_library(dynlib SHARED) : SHARED生成动态库, 后缀名 .so 和 .dylib
# slib会生成静态库,dynlib会生成动态库
9、target_sources - 资源文件编译成库,与add_library一起使用
# slib.cpp 资源文件生成slib静态库
# 把dynlib.cpp资源文件生成dynlib动态库
10、add_executable - 生成可执行文件
add_executable(helloworld)
# 生成helloworld可执行文件,类似于.exe执行程序
11、target_link_libraries - 将目标文件与库文件进行链接
target_link_libraries(helloworld PRIVATE slib dynlib)
# helloworld 执行程序链接slib、dynlib库
12、target_include_directories - 将目标文件添加头文件目录,它与target_link_libraries经常一起连用
target_include_directories(slib INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
target_include_directories(dynlib INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
# PRIVATE : 只在slib、dynlib库里面添加slib和dynlib的头文件的路径
# INTERFACE : 在slib、dynlib库里面添加路径,引用方也会引用他们库文件路径,原因是target_link_libraries语法导致的。例如:helloworld里面使用target_link_libraries来引用slib和dynlib,同时就会包含slib和dynlib的头文件的路径。
# PUBLIC = PRIVATE + INTERFACE
13、list : 在变量后面追加新的值
set (A 1)
list(APPEND A 2 )
# A 现在的值为1、2
14、function : Cmake中函数的定义
三、变量文档总结
CMake文档大全 : https://www.cnblogs.com/52php/p/5684588.html
谷歌文档:https://cmake.org/cmake/help/v3.0/manual/cmake-commands.7.html
项目工程: https://github.com/zhang1shun1wei/CMakeProject 一定运行hellowrold执行文件
https://www.bilibili.com/video/BV1cQ4y1K7PD/?spm_id_from=pageDriver : 视频学习