目录
1. CMake简介
CMake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。
现如今,有各种各样的 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。针对每一种Make工具写一遍Makefile显然非常浪费时间。
CMake 就是针对上面问题所设计的工具:首先,它允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件。
在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:
1) 编写 CMake 配置文件 CMakeLists.txt 。
2) 执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile(ccmake 和 cmake 的区别在于前者 提供了一个交互式的界面)。其中, PATH 是 CMakeLists.txt 所在的目录。
3) 使用 make 命令进行编译。
2. 基本命令
#cmake最低版本
cmake_minimum_required(VERSION 3.6.0)
#指定项目
project(Main)
add_executable(demo demo.cpp) # 生成可执行文件
add_library(common STATIC util.cpp) # 生成静态库
add_library(common SHARED util.cpp) # 生成动态库或共享库
搜索c/cpp文件
# 搜索当前目录下的所有.cpp文件, 但不能查找子目录
aux_source_directory(. SRC_LIST)
add_library(demo ${SRC_LIST})
#也可以
file(GLOB DIR_SRCS *.c)
add_executable(main ${DIR_SRCS})
使用子目录中的CMakeList
# 添加 child 子目录下的cmakelist
add_subdirectory(child)
# 指定生成目标
add_library(main ${DIR_SRCS})
# 添加链接库
target_link_libraries(main child)
//--------------------------------------
# child中设置
aux_source_directory(. DIR_LIB_SRCS)
# 生成链接库 默认生成静态库
add_library (child ${DIR_LIB_SRCS})
#指定编译为静态库
add_library (child STATIC ${DIR_LIB_SRCS})
设置预编译宏
#设置预编译宏 cflag和cxxflag
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTEST" )
set(CMAKE_Cxx_FLAGS "${CMAKE_Cxx_FLAGS} -DTEST" )
引入头文件
#这样就可以使用 #include <xx> 引入
#否则需要使用 #include "path/xx"
include_directories( imported-lib/include/ )
逻辑判断语句
#逻辑判断 计较字符串
set(ANDROID_ABI "areambi-v7a")
if(${ANDROID_ABI} STREQUAL "areambi")
message("armv5")
elseif(${ANDROID_ABI} STREQUAL "areambi-v7a")
message("armv7a")
else()
endif()
build.gradle配置
//还可以在gradle中使用 arguments 设置一些配置
externalNativeBuild {
cmake {
arguments "-DANDROID_TOOLCHAIN=clang", //使用的编译器clang/gcc
"-DANDROID_STL=gnustl_static" //cmake默认就是 gnustl_static
cFlags "" //这里也可以指定cflag和cxxflag,效果和之前的cmakelist里使用一样
cppFlags ""
}
}