8.1 CMake简介
- CMake是一个跨平台的编译工具,能输出各种各样的makefile或project文件。
- CMake是一个强大的自动化配置工具,通过读取脚本文件——CMakeLists.txt中的规则来构建编译系统。
- CMake并不直接构建出最终的文件,而是生成标准的Makefile文件或其他需要的平台上的项目文件。
8.2 CMake安装
Android studio新建JNI项目时会生成基础的CMakeList.txt,修改该文件可以在项目中添加或修改项目各种配置属性。
PC本地的cmake安装可以在Download | CMake中下载最新版的CMake,按照解压后包中的README文件进行安装。
如 Linux中:
tar -zxvf cmake安装包 //解压缩cmake包
cd cmake包 //进入cmake包
./bootstrap && make && sudo make install //运行安装程序
cmake --version //查看cmake版本,检验是否安装成功
8.3 编译流程
- Windows(未验证)
- 创建build文件夹
- 在build文件夹中执行 cmake .. 命令
- 用Visual Studio打开生成的demo.sln,然后编译
- linux
- 依次输入以下命令:
mkdir build //创建build目录
cd build //进入build目录
cmake .. //执行cmake配置并生成makefile,需要上级目录有CMakeLists.txt文件
make //启动makefile文件
8.4 常用命令
CMakeLists.txt 的语法比较简单,由命令、注释和空格组成。其中命令是不区分大小写的。指令是大小写无关的,参数和变量是大小写相关的,推荐全部使用大写指令。符号 # 后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。
cmake_minimum_required(version 版本号) //指定cmake的最小版本
project(项目名称) //定义工程名称
set(var [value]) //显式定义变量
add_library(库名称 STATIC 代码文件名) //编译静态库
add_library(库名称 SHARED 代码文件名) //编译动态库
add_executable(可执行程序名 代码文件名称) //编译可执行程序
add_dependencies(target item1 item2...) //指定target依赖与其他item, 这里的item必须是add_executable, add_library,
add_custom_target等命令创建的目标
link_directories(链接库目录) //设置链接库目录
target_link_libraries(target item1 item2...) //指定target需要连接item1, item2等
include_directories(包含目录) //设置包含目录
add_definitions(-D宏名称) //设置宏定义,如:add_definitions(-DLINUX)
file(GLOB ALL_FILE_PATH 文件目录) //将目录中的文件添加到ALL_FILE_PATH中
add_subdirectory(src) //添加子文件夹,会在执行完当前CMakeLists.txt后执行src子目录下的CMakeLists.txt
message(属性 消息) //输出消息,含正常,警告,错误等属性的信息
8.5 预定义变量
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(src bin)可以更改此变量的值
CMAKE_CURRENT_LIST_FILE 输出调用这个变量的CMakeLists.txt的完整路径
CMAKE_CURRENT_LIST_LINE 输出这个变量所在的行
CMAKE_MODULE_PATH 定义自己的cmake模块所在的路径
EXECUTABLE_OUTPUT_PATH 重新定义目标二进制可执行文件的存放位置
LIBRARY_OUTPUT_PATH 重新定义目标链接库文件的存放位置
PROJECT_NAME 返回通过PROJECT指令定义的项目名称
CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS 用来控制IF ELSE语句的书写方式