CMakeLists.txt 的语法比较简单,由命令、注释和空格组成,其中命令不区分大小写。符号 # 后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。
常见的命令如下:
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Test)
# 将指定目录中的所有源文件保存到变量中
aux_source_directory(. DIR_SRC)
# 添加子目录 math,该目录下的 CMakeLists.txt 文件和源代码也会被处理
add_subdirectory(math)
# 指定生成目标
add_executable(Test ${DIR_SRC})
# 添加链接库
target_link_libraries(Test MathFunctions)
# math 目录下的 CMakeLists.txt
# 将指定目录中的所有源文件保存到变量中
aux_source_directory(. DIR_LIB_SRC)
# 生成静态链接库
add_library(MathFunctions ${DIR_LIB_SRC})
交叉编译是 CMake 从 2.6.0 版本开始支持的。意为在 host 宿主机上生成 target 目标机的程序。编译过程中涉及头文件切换和编译器的选择等等。
须知:
CMake 不能自动判断目标系统,需要指定
一般情况下 build 出来的可执行文件不能直接运行在宿主机上。
编译过程中不能用宿主机上的原生头文件和库,而是用一套不同的头文件和库。
以上提到的一些变量会放到一个 cmake 脚本文件中,然后通过 CMAKE_TOOLCHIAIN_FILE 传递给 CMake,这也是 CMake 专门为交叉编译预留的很好用的一个变量,里面设置了一系列需要改变的变量和属性。 为了不让用户每次交叉编译重新输入这些变量,才引入了该 toolchain 机制,其实就是一个 cmake 脚本。
cmake -D CMAKE_TOOLCHIAIN_FILE="/ndk/build/cmake/android.toolchain.cmake"
android.toolchain.cmake 中的一些变量:
CMAKE_SYSTEM_NAME 目标机的 OS 名称,如 LIinux,Android,Generic
CMAKE_SYSTEM_PROCESSOR CPU 型号,例如:ARM,X86
CMAKE_C_COMPILER C 语言编译器
CMAKE_CXX_COMPILER C++编译器
CMAKE_FIND_ROOT_PATH 搜索查找外部依赖的根路径
CMAKE_FIND_ROOT_PATH_MODE_PROGRAM 对 FIND_PROGRAM 起作用,NEVER,ONLY,BOTH
CMAKE_FIND_ROOT_PATH_MODE_LIBRARY 对 FIND_LIBRARY 起作用