linux Cmake交叉编译文件到手机运行
前言:
在linux上编译一个可执行文件很简单:
clang++ main.cpp -o main
生成了main的可执行文件
交叉编译其实也是一样的过程,但不一样的就是环境和编译器的选择。
STEP1 交叉环境的搭建
交叉编译实际上就是在这台系统的环境下,编译出另一个系统的文件,并且在另一个系统上能够运行,因此,编译andorid 的可执行文件,就需要有andorid的环境,这个环境就是android NDK。
在这个网站上下载NDK,并且解压出来:
https://developer.android.google.cn/ndk/downloads?hl=zh-cn
STEP2 Cmake的编写
Cmake主要是生成mkfile的,他会把CMakeLists.txt 做成makefile文件。
#****************************This is Project Info****************************
cmake_minimum_required(VERSION 3.4)
# 设置项目名称和版本
project(app1 VERSION 1.0)
set(NDK_PATH /home/dzk/disk/android_ndk)
#STEP 1设置交叉编译环境和工具
set(CMAKE_SYSTEM_NAME Android) #要构建的目标平台,比如要构建成android平台的
set(CMAKE_SYSTEM_PROCESSOR arm) #是要构建的目标体系结构,这个平台是什么架构,一般是arm
set(CMAKE_ANDROID_ARCH_ABI armeabi-v7a) #编译的二进制接口(armeabi-v7a、arm64-v8a、x86、x86_64)
set(CMAKE_ANDROID_NDK /home/dzk/disk/android_ndk/android-ndk-r26d) #andorid ndk的位置,可以从https://developer.android.google.cn/ndk/downloads?hl=zh-cn 下载最新的
#STEP 2选用编译器,我选用的是clang++ 的编译器,当然也可以选择g++的,只不过android NDK 后面好像不支持g++了
#这里有个重点,即尽量选用NDK 里面的clang++, 如果不使用NDK 的clang,就会出现生成的可执行文件64位和32位不匹配的问题
set(triple arm-linux-gnueabihf)
set(CMAKE_ANDROID_TOOLCHAIN /home/dzk/disk/android_ndk/android-ndk-r26d/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang++)
set(CMAKE_CXX_COMPILER /home/dzk/disk/android_ndk/android-ndk-r26d/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang++)
set(CMAKE_CXX_COMPILER_TARGET ${triple})
set(CMAKE_SYSTEM_VERSION 21) # API level 21, 这里和上面的版本是一致的,也可以不一样
#set(CMAKE_ANDROID_STL_TYPE gnustl_static) #制定的c++ stl 库类型,可以设置
#大概意思可能是选用NDK 里面的cmake,我试过不加好像也可以
#set(CMAKE_TOOLCHAIN_FILE /home/dzk/disk/android_ndk/android-ndk-r26d/build/cmake/android.toolchain.cmake)
#STEP3 编译
add_executable(myapp
main.cpp
)
STEP3 编译
我的目录是这样的
myapp
|–build
|–CMakeLists.txt
|–main.cpp
这个build的目录是空的,一般切到build目录下,运行
cmake .. //生成make file
make //make 编译
STEP4 编译文件推到手机里面运行
adb push myapp vendor/bin
adb shell myapp