目录
CMake 安卓NDK编译常用语法
CMake版本
cmake_minimum_required(VERSION 3.5)
设置项目名称
project(my_project_name)
- 设置之后使用
${PROJECT_NAME}
就可以得到项目名称
###常用的内置变量
PROJECT_NAME
- 返回通过 PROJECT 定义的项目名称
CMAKE_C_FLAGS
- 编译 C 文件时的选项,默认为空
CMAKE_CXX_FLAGS
- 编译 C++ 文件时的选项,默认为空
CMAKE_SHARED_LINKER_FLAGS
- 链接动态库时的选项,默认为空
PROJECT_SOURCE_DIR
- 工程的根目录,同
CMAKE_SOURCE_DIR
- 工程的根目录,同
CMAKE_CXX_COMPILER_ID
- 获取当前编译器ID,大部分是
Clang
、GNU
、Intel
、MSVC
的其中一种
- 获取当前编译器ID,大部分是
ANDROID_ABI
- 当前编译的安卓ABI类型,是
armeabi-v7a
、armeabi-v7a with NEON
、arm64-v8a
的其中一种
- 当前编译的安卓ABI类型,是
平台 32&64
if("${ANDROID_ABI}" STREQUAL "armeabi-v7a" OR "${ANDROID_ABI}" STREQUAL "armeabi-v7a with NEON")
set(ANDROID_STL "gnustl_shared")
set(ANDROID_TOOLCHAIN "gcc")
set(STRIP_PATH "arm-linux-androideabi")
message("current ABI is: ${ANDROID_ABI}")
elseif ("${ANDROID_ABI}" STREQUAL "arm64-v8a")
set(ANDROID_STL "c++_shared")
set(ANDROID_TOOLCHAIN "clang")
set(STRIP_PATH "aarch64-linux-android")
message("current ABI is: ${ANDROID_ABI}")
else()
message(FATAL_ERROR "${ANDROID_ABI} is no support")
endif()
路径相关配置
# 设置cmake编译库输出的位置
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI})
# 设置头文件搜索路径
include_directories(
...
)
# 设置需要编译的源文件
file(
GLOB SOURCE_FILES
...
)
# 设置库文件搜索路径
link_directories(
...
)
设置生成动态库文件
add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES})
常用的编译和链接选项
编译选项
CMAKE_CCXX_FLAGS_RELEASE
、CMAKE_CCXX_FLAGS_RELEASE
-fno-rtti
- 禁用运行时类型信息
-fno-exceptions
- 禁用异常机制
-fPIC
- 生成与位置无关代码
-O3
- 编译优化选项,常加到
CMAKE_C/CXX_FLAGS_RELEASE
中
- 编译优化选项,常加到
-ffunction-sections -fdata-sections
- 可以减少库体积的优化选项
-std=c++11
- 使用c++11标准库,如果代码中有用到的话,加到
CMAKE_CXX_FLAGS
中
- 使用c++11标准库,如果代码中有用到的话,加到
链接选项
CMAKE_SHARED_LINKER_FLAGS
-Wl,-Bsymbolic
- 优先使用库内符号,避免加载的时候使用了程序中其他同名静态变量
-Wl,--gc-sections
- 未使用的代码不会被链接,减少库体积
-dead-strip
- 删除未使用的符号,减少库体积
链接第三方库
# 设置需要链接的库文件
target_link_libraries(${PROJECT_NAME}
...
- 常用的安卓库
- android: jni库
- log: 打印日志
- jnigraphics: 安卓图片库
- EGL: OpenGL相关
- GLESv: OpenGLES2.0相关
导出有符号和无符号库
add_custom_command(TARGET ${PROJECT_NAME}
POST_BUILD
COMMAND cp ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI}/libmbccore.so ${PROJECT_SOURCE_DIR}/obj/${ANDROID_ABI}/
COMMAND ${ANDROID_NDK_PATH}/toolchains/${STRIP_PATH}-4.9/prebuilt/darwin-x86_64/bin/${STRIP_PATH}-strip --strip-all ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI}/libmbccore.so
COMMAND ditto 其他第三方.so库 ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI}
)
- 注意这里的
${ANDROID_NDK_PATH}
需要通过外部指定进来