Toc
0 results found
Boost库在Android NDK环境内的编译
2021/06/30 Android NDK

在常用的库依赖中,例如opencv,glog等,由于这项目都是通过CMakeLists.txt 完成编译,只需要简单的指定NDK的编译器,使用如下的编译指令就可以完成项目的编译,生成所需要的库文件。

cd <project>
mkdir build && cd build
cmake \
-DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=arm64-v8a \
-DANDROID_NATIVE_API_LEVEL=android-23 \
-DANDROID_STL=c++_shared \
..

但是,与上述项目不同,Boost使用的编译工具主要是自带的bootstrap.sh,需要的编译过程则会更加复杂,在这里以1.65.0版本的Boost为例,详细介绍一下如何在Ubuntu环境内交叉编译获得32位以及64位的Boost库文件。

首先,我们需要通过Boost官方页面下载指定版本的压缩包,这里需要注意的是,因为压缩包和Github上的Boost仓库并不一致,不要下载Boost仓库并切换分支。下载完成后我们将下载的压缩包解压并切换至解压文件夹。

之后我们需要产生编译Boost所需要的toolchain文件,我们需要指定好NDK的路径,确认该变量在系统中可用,指令echo $NDK可以正常运行。然后,我们使用下面脚本完成工具链的生成。

toolchain=$PWD/toolchain
# arm64-v8a
$NDK/build/tools/make-standalone-toolchain.sh \
--arch=arm64 --platform=android-23 \
--install-dir="$toolchain" \
--toolchain=aarch64-linux-android-clang \
--use-llvm --stl=c++_shared

# armeabi-v7a
$NDK/build/tools/make-standalone-toolchain.sh \
--arch=arm --platform=android-23 \
--install-dir="$toolchain" \
--toolchain=armeabi-linux-android-clang \
--use-llvm --stl=c++_shared

第三步,我们需要生成编译所需要的user-config.jam文件,执行如下指令:

user_config=tools/build/src/user-config.jam
rm -f $user_config
# arm64-v8a
cat <<EOF > $user_config
import os ;

using clang : android
:
"$toolchain/bin/clang++"
:
<archiver>$toolchain/bin/aarch64-linux-android-ar
<ranlib>$toolchain/bin/aarch64-linux-android-ranlib
;
EOF

# armeabi-v7a
cat <<EOF > $user_config
import os ;

using clang : android
:
"$toolchain/bin/clang++"
:
<archiver>$toolchain/bin/arm-linux-androideabi-ar
<ranlib>$toolchain/bin/arm-linux-androideabi-ranlib
;
EOF

最后,执行常规的bootstrap.sh以及b2便可以编译生成库文件,在此过程中,我们可以指定编译库的安装路径。由于我们编译获得的是安卓上的库文件,强烈不建议安装到系统/usr/local路径下,我们可以直接编辑bootstrap.sh文件中的PREFIX变量为PWD/install

./bootstrap.sh --with-toolset=clang

./b2 -j32 \
--with-atomic \
--with-chrono \
--with-container \
--with-date_time \
--with-exception \
--with-filesystem \
--with-iostreams \
--with-locale \
--with-log \
--with-program_options \
--with-random \
--with-regex \
--with-serialization \
--with-system \
--with-test \
--with-thread \
--with-timer \
--address-model=32 \
toolset=clang-android \
architecture=arm \ # arm64 for arm64-v8a
variant=release \
--layout=versioned \
target-os=android \
threading=multi \
threadapi=pthread \
link=shared \
runtime-link=shared \
install

最后我们可以在当前路径下的install文件夹内找到所有的库文件和头文件并在安卓工程中使用它们。

打赏
支付宝
微信
本文作者:Chronus
版权声明:本文首发于Chronus的博客,转载请注明出处!