写在前面
此篇文章用于记录在将qt开发的基于桌面的程序移植到android过程中,遇到的第三方库gsl移植问题。 由于之前的开发只是简单的界面,移植非常简单,在qt编译时,选择不同的编译器即可,但当程序中使用了第三方开源库后,需要将库编译成与目标平台对应的库,才能编译运行,因此需要使用到交叉编译重新编译第三方库,之前并未接触过,不太熟悉脚本编译过程,感谢广大网友,百度搜索几天,才编译出正确的库。
准备
开发平台:windows 开发工具:qt5.9.9,安装时注意勾选android windows下GNU环境:msys GSL包:gsl-2.4
步骤
打开msys GNU环境
将msys复制到qt安装目录的mingw53_32文件夹下。然后运行msys目录下的msys.bat,即可打开GNU环境。如下图所示。
制作工具链
制作工具链参考链接 此处把脚本保存为make-toolchain.sh,将脚本文件放到ndk安装目录/build/tools目录下。 脚本说明如下: DEV:android ndk安装目录的上一级目录 NDK_HOME:android ndk的安装目录 platform:从android ndk/platforms目录下选择一个即可。 –install-dir:修改为生成的各个架构工具链的存放位置 我修改后脚本文件如下。
#!/bin/sh
export DEV=D:/Android
export NDK_HOME=${DEV}/android-ndk-r12b
platform=android-21
shmake=$NDK_HOME/build/tools/make-standalone-toolchain.sh
archs=(
'arm'
'arm64'
'x86'
'x86_64'
'mips'
'mips64'
)
toolchains=(
'arm-linux-androideabi-4.9'
'aarch64-linux-android-4.9'
'x86-4.9'
'x86_64-4.9'
'mipsel-linux-android-4.9'
'mips64el-linux-android-4.9'
)
echo $NDK_HOME
num=${#archs[@]}
for ((i=0;i<$num;i++))
do
sh $shmake --arch=${archs[i]} --platform=$platform --install-dir=D:/Android/chain/android_toolchain/${archs[i]} --toolchain=${toolchains[i]}
done
编译库
环境变量脚本文件
此处环境变量配置脚本参考的是以下链接[https://www.jianshu.com/p/e1f11178d826] 使用以下脚本,配置环境变量,保存为android-toolchain-env.sh,建议将该脚本文件放置到gsl文件夹下 DEV:ndk安装目录的上级目录 CHAIN_ENV:制作的工具链的存放目录 PREFIX:制作的工具链目录的上级目录 GCC_VER:ndk安装目录/toolchains下对应目标平台的版本 ANDROID_API:与制作工具链时使用的android platform的版本一致 ANDROID_ARCH:为目标平台架构,此处我使用的android平台架构为arm ANDROID_TARGET:目标平台,此处我使用的是arm-linux-androideabi TOOLCHAIN:工具链,此处我使用的是ndk目录下的toolchains文件夹下 LIBS:调用库,-lc是搜索libc标准c库,增加-lm是搜索libm的math库,因为gsl中用到了数学库中的函数,因此必须要增加-lm选项,否则,编译库会有错误,无法找到sin,cos等。
#!/bin/sh
export DEV=/D/Android
export CHAIN_ENV=${DEV}/chain/android_toolchain
export PREFIX=${DEV}/chain
export PKG_CONFIG_PATH=${PREFIX}/lib/pkgconfig
export GCC_VER=4.9
export BUILD_SYS=x86_64-linux-gnu
export ANDROID_API=21
export ANDROID_ARCH=arm
export ANDROID_TARGET=arm-linux-androideabi
export TOOLCHAIN=arm-linux-androideabi
export NDK=${CHAIN_ENV}/android-ndk-r12b
export NDK_TOOLCHAIN=${CHAIN_ENV}/${ANDROID_ARCH}
export SYSROOT=${NDK_TOOLCHAIN}/sysroot
export CROSS_PREFIX=${NDK_TOOLCHAIN}/bin/${TOOLCHAIN}
export AR=${CROSS_PREFIX}-ar
export AS=${CROSS_PREFIX}-as
export LD=${CROSS_PREFIX}-ld
export NM=${CROSS_PREFIX}-nm
export CC=${CROSS_PREFIX}-gcc
export CXX=${CROSS_PREFIX}-g++
export CPP=${CROSS_PREFIX}-cpp
export CXXCPP=${CROSS_PREFIX}-cpp
export STRIP=${CROSS_PREFIX}-strip
export RANLIB=${CROSS_PREFIX}-ranlib
export STRINGS=${CROSS_PREFIX}-strings
export PATH=$PATH:${PREFIX}/bin:${PREFIX}/lib
export CFLAGS="--sysroot=${SYSROOT} -I${SYSROOT}/usr/include -I${PREFIX}/include -fPIE -DANDROID -Wno-multichar"
export CXXFLAGS=${CFLAGS}
export CPPFLAGS="--sysroot=${SYSROOT} -I${SYSROOT}/usr/include -I${NDK_TOOLCHAIN}/include/c++/ -DANDROID -DNO_XMALLOC -mandroid"
export LIBS="-lc -lm"
export LDFLAGS="-Wl,-rpath-link=-I${SYSROOT}/usr/lib -L${SYSROOT}/usr/lib -L${PREFIX}/lib -L${NDK_TOOLCHAIN}/lib"
编译
打开msys.bat,进入GNU环境,进入gsl-2.4目录,输入以下命令:
source android-toolchain-env.sh
./configure --host=${TOOLCHAIN} --prefix=/f/gsl-2.4/android-output
make -j8
make install
执行结束后,会在android-output文件夹下生成库文件,如下图所示。 其中lib文件下为qt工程中需要添加的库文件,添加libgsl.a和libgslcblas.a。
|