CMake 安卓NDK编译常用语法

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的其中一种 ANDROID_ABI 当前编译的安卓ABI类型,是armeabi-v7a、armeabi-v7a with NEON、arm64-v8a的其中一种

平台 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_RELEASECMAKE_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中

链接选项

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}需要通过外部指定进来
经验分享 程序员 微信小程序 职场和发展