android开发cmake编译多个有相互依赖的c/cpp模块源代码的配置方法
1. 项目目录结构配置如下:
root-project //根目录直接引用根目录下的CMakeLists
cpp1Project
/src/main/c/CMakeLists.txt //cpp1的
cpp2Project
/src/main/cpp/CMakeLists.txt //cpp2的
CMakeLists.txt //根目录的,它将引用cpp1Project和cpp2Project下的CMakeLists.txt文件
2. root-project根目录下的build.gradle配置如下:
defaultConfig {
externalNativeBuild {
cmake {
arguments '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=c++_shared', '-DCMAKE_VERBOSE_MAKEFILE=ON' //-D是传递编译参数,如-DVERBOSE=1打开cmake编译log开关
cppFlags '-Wl,--gc-sections', '-fno-exceptions', '-fno-rtti', '-fvisibility=hidden'
cFlags '-Wl,--gc-sections', '-fvisibility=hidden' //上面两行Flags配置是sections节区优化配置
abiFilters = ["armeabi-v7a"] //指定编译的abi类似
}
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt" //引用根目录下的CMakeLists.txt
}
}
ndk{
abiFilters = ["armeabi-v7a"] //指定打包的abi类似,和指定编译的abi类似有点不一样哦
}
//注意:如果cpp1Project想单独编译自己的c源代码,也可以配置类似root-project下的build.gradle配置
3. root-project根目录下的CMakeLists.txt配置如下:
cmake_minimum_required(VERSION 3.4.1)
//就那么多配置,包含root-project根目录下两个子项目的CMakeLists.txt所在的目录。
//cmake会自动找到并该目录下的CMakeLists.txt文件并执行
add_subdirectory(cpp1Project/src/main/c)
add_subdirectory(cpp2Project/src/main/cpp)
4. cpp1Project下生成libhook.a静态库的CMakeLists.txt文件配置如下:
cmake_minimum_required(VERSION 3.4.1)
project(hook C) //指定为c项目,类似有project(hook CXX C ASM)
set(hook_source_dir ${CMAKE_CURRENT_SOURCE_DIR}) //定义变量hook_source_dir
set(hook_source
${hook_source_dir}/core.c
${hook_source_dir}/hook.c
...) //定义变量hook_source 也可以使用file GLOB搞定
add_library(hook STATIC ${hook_source}) //生成libhook.a静态库,也可以使用SHARED生成动态库
find_library(log-lib log)//查找系统目录(\21.4.7075529\platforms\android-21\arch-arm\usr\lib)下的liblog.so库,取名为log-lib
//target_include_directories与include_directories区别(适用范围不同):
//target_include_directories包含的头文件使用范围仅限与当前目标或者说当前目录
//include_directories包含的头文件,子目标或者说子目录也可以使用到,如果根目录下使用了那就子目录也有效,注意不能滥用
target_include_directories(hook PUBLIC ${hook_source_dir}) //包含头文件,不同于include_directories
target_link_libraries(xhook ${log-lib}) //链接上面find到的log-lib库
5. cpp2Project下生成libtrace.so动态库(依赖libhook.a静态库)的CMakeLists.txt文件配置如下:
cmake_minimum_required(VERSION 3.4.1)
project(trace CPP)
include_directories(
${CMAKE_SOURCE_DIR}
)
//cpp2Project使用cpp1Project下的头文件
//或者target_include_directories(trace PUBLIC ${CMAKE_SOURCE_DIR}/cpp1Project/src/main/c/hook/),不过要放在add_library(trace ...)后面,因为生成了target才能找到trace目标
include_directories(${CMAKE_SOURCE_DIR}/cpp1Project/src/main/c/hook/)
add_library(trace SHARED Trace.cc) //生成libtrace.so动态库
target_link_libraries(trace //将log库和hook库链接到目标trace
log //链接系统目录下的liblog.so动态库,不用指定前缀lib和后缀.so会自动匹配
hook) //链接上面cpp1Project生成的libhook.a静态库,不用指定前缀lib和后缀.a会自动匹配