Android studio NDK 中推荐用 cmake 工具构建 native 工程。 我在写 NDK 库的时候顺便学了 cmake 语法。
cmake 下载网址:
cmake 允许开发者编写 CMakeLists.txt 文件来控制编译流程,再根据目标板平台的编译工具链自动生成 Makefile 。如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。
我在开发过程中使用到 Android 和 arm Linux 开发环境。特别是移植和测试某些库的时候, 在Android 环境要写 Android.mk , 在 Linux 环境要Ubuntu 和 arm Linux 的 makefile。 用 CMakeLists.txt 省去了编写多个 makefile 。
下面给出个交叉编译的 CmakeLists.txt 范例:
cmake_minimum_required(VERSION 3.4.1)
# 设置工程名称
project(test project)
# 设置目标文件名
set(TAG test)
# 交叉工具链,必须配置
set(CMAKE_SYSTEM_NAME Linux)
# 指定交叉编译环境安装目录
# set(CMAKE_FIND_ROOT_PATH /opt/hisi-linux/x86-arm/arm-hisiv300-linux)
# 设置编译器和编译参数
set(CMAKE_C_COMPILER /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin/arm-hisiv300-linux-gcc)
# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
set(CMAKE_CXX_COMPILER /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin/arm-hisiv300-linux-g++)
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
add_definitions(-DLINUX)
# 编译模式 CMAKE_BUILD_TYPE 枚举如: Debug Release RelWithDebInfo MinSizeRel
set(CMAKE_BUILD_TYPE "Debug")
# set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_C_FLAGS_DEBUG "$ENV{CFLAGS} -O0 -Wall -g -ggdb -mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -ffunction-sections")
set(CMAKE_C_FLAGS_RELEASE "$ENV{CFLAGS} -O2 -Wall")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O2 -Wall")
# 设置输出目录
if(${CMAKE_BUILD_TYPE} STREQUAL "Release")
message("build Release")
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../bin/release)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../lib/release)
elseif(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../bin/debug)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../lib/debug)
message("build Debug")
else()
message("build default")
endif()
#################################################################################################
# 添加指定目录的源文件
aux_source_directory(. SRC_LIST1)
aux_source_directory(./subdir1 SRC_LIST2)
set(SRC_LIST ${SRC_LIST1} ${SRC_LIST2})
message("SRC_LIST ${SRC_LIST}") # 打印变量
# 添加头文件目录
set(INC_PATH ${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/avutil)
include_directories(${INC_PATH})
# 添加链接库的路径
set(LINK_PATH ${PROJECT_SOURCE_DIR}/../lib)
link_directories(${LINK_PATH})
# 添加库
set(usrlibs
# 链接库列表
pthread
m)
# 编译项目
# add_executable( ${TAG }
# ${SRC_LIST})
# 编译库
# add_library(${TAG }
# SHARED # 编译库的类型 SHARED STATIC
# ${SRC_LIST})
add_library(${TAG}
STATIC # 编译库的类型 SHARED STATIC
${SRC_LIST})
# 编译执行文件的链接库, 放在 add_library add_executable 后面
target_link_libraries(${TAG} ${usrlibs})