常用命令
指定cmake最低支持的版本
cmake_minimum_required(VERSION 3.4.1)
查找当前目录所有源文件 并将源文件名称列表保存到DIR_SRCS变量
不能查找子目录
aux_source_directory(. DIR_SRCS)
#add_library 添加一个库,名为name
#指定库类型 STATIC SHARED MODULE
#EXCLUDE_FROM_ALL : 表示该库不会被默认构建
#source1 source2...sourceN : 指定库的源文件
add_library(
native-lib
SHARED
native-lib.cpp)
#add_library 导入预编译库
#一般配合set_target_properties使用
add_library(test
SHARED
IMPORTED)
set_target_properties(
test #指定目标库名
PROPERTIES IMPORTED_LOCATION #指明要设置的参数
${CMAKE_ANDROID_ARCH_ABI}/libtest.so #导入库的路径
)
常用命令-set
#设置可执行文件的输出路径
set(EXECUTABLE_OUTPUT_PATH [path])
#设置库文件的输出路径
set(LIBRARY_OUTPUT_PATH [output_path])
#设置C++编译参数
set(CMAKE_CXX_FLAGS "-Wall std=c++11")
#设置源文件集合(SOURCE_FILES是自定义的变量)
set(SOURCE_FILES main.cpp test.cpp)
其他命令
#设置头文件目录
#相当于g++选项中的-l参数
include_directories(./include )
#添加可执行文件
add_executable(<name> ${SRC_LIST})
#将若干库链接到目标库文件
#将lib1/lib2/lib3链接到<name>库里面
#链接顺序应该符合gcc链接顺序规则,被链接的库放在依赖它的库的后面
#如果lib1依赖于lib2,lib2依赖于lib3,则必须严格按照lib1 lib2 lib3顺序排列,否则会报错
target_link_libraries(<name> lib1 lib2 lib3)
#如果出现相互依赖的静态库,CMake会运行出现依赖循环
add_library(A STATIC a.c)
add_library(B STATIC b.c)
target_link_libraries(A B)
target_link_libraries(B A)
add_executable(main main.c)
target_link_libraries(main A)
#添加一些参数
#为当前路径以及子目录的源文件加入由-D引入的define flag
add_definitions(-DFOO -DDEBUG ...)
#sub_dir 指定包含CMakeLists.txt和源码文件的子目录位置
#[binary_dir]是输出路径,一般可以不指定
#如果当前目录下还有子目录时可以使用add_subdirectory,子目录中也需要包含有CMakeLists.txt
add_subdirectory(sub_dir [binary_dir])
常用命令-file
文件操作命令
#设置某个路径的一种属性
#prop1 prop2代表属性,取值为:
#
set_directory_properties(PROPERTIES prop1 value1 prop2 value2)
添加多个源文件
#查找当前目录所有源文件 并将名称保存到DIR_SRCS变量
#不能查找子目录
aux_source_directory(. DIR_SRCS)
#也可以使用file
file(GLOB DIR_SRCS *.c *.cpp)
add_library(
native-lib
SHARED
${DIR_SRCS}
)
多目录、多源文件
主CMakeLists.txt
#添加child子目录下的CMakeLists
aux_source_directory(. DIR_SRCS)
add_subdirectory(child)
add_library(
native-lib
SHARED
${DIR_SRCS}
)
#目标文件需要依赖child
target_link_libraries(native-lib child)
子CMakeLists.txt
#child目录下的CMakeLists.txt
aux_source_directory(. DIR_SRCS)
add_library(
child
SHARED
${DIR_SRCS}
)
添加预编译库
Android6.0以前
add_library(
libimport
SHARED
IMPORTED
)
set_directory_properties(
libimport
PROPERTIES
IMPORT_LOCATION
<路径>/libimport.so
)
aux_source_directory(. DIR_SRCS)
add_library(
native-lib
SHARED
${DIR_SRCS}
)
target_link_libraries(native-lib libimport)
添加预编译库
Android6.0后
#set命令定义一个变量
#CMAKE_CXX_FLAGS : cpp的参数,会传递给编译器
#如果是C文件,需要用CMAKE_C_FLAGS
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L[so所在目录]")
添加第三方库
#添加头文件目录
include_directories(${CMAKE_SOURCE_DIR}/lib)
#设置第三方so库的路径
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}")
#设置依赖的库,ff和ff1在jniLibs目录里
target_link_libraries(
native-lib
ff
ff1
log
)
build.gradle配置
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.hujun.myapplication"
minSdkVersion 19
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
cFlags ""
//指定需要编译的cpu架构
abiFilters "armeabi-v7a"
}
}
}
externalNativeBuild {
cmake {
//指定CMakeLists.txt的路径
path "src/main/cpp/CMakeLists.txt"
version "3.10.2"
}
}