Protobuf NDK以及QNX交叉编译
1. 背景
Protobuf 用处很广,尤其是通讯数据序列化,反序列化。
TODO
2. 下载资源
protobuf镜像地址:github-protobuf
Android ndk下载:Android ndk
QNX tools下载: prebuilt_QNX700
下载完,解压!
TODO
3. 实操
废话不多数,直接上编译脚本
3.1 NDK交叉编译脚本
build_android.sh
#!/bin/sh
###################################
#### build script for protobuf
#### taget:qnx
#### Date: 2022-11-01
#### Author: 村里小码农
###################################
# qnx bsp dir
NDKROOT_PATH=/workspace/tools/android-ndk-r23b
TOOLCHAIN=$NDKROOT_PATH/toolchains/llvm/prebuilt/linux-x86_64
# current dir
CURRENT_PATH=$(pwd)
# config Compile param.
TARGET_API=28
#
TARGET_ANDROID_PLATFORM=android-$TARGET_API
#预留
TARGET=aarch64-linux-android
#TARGET_ABI=armeabi-v7a
TARGET_ABI=arm64-v8a
PREFIX=$CURRENT_PATH/build/android/$TARGET_ABI
if [ -d $PREFIX ];then
rm -rf $PREFIX
mkdir -p $PREFIX
else
mkdir -p $PREFIX
fi
if [ ! -f $TOOLCHAIN/bin/$TARGET$TARGET_API-ar ];then
ln -s $TOOLCHAIN/bin/llvm-ar $TOOLCHAIN/bin/$TARGET$TARGET_API-ar
fi
if [ ! -f $TOOLCHAIN/bin/$TARGET$TARGET_API-nm ];then
ln -s $TOOLCHAIN/bin/llvm-nm $TOOLCHAIN/bin/$TARGET$TARGET_API-nm
fi
if [ ! -f $TOOLCHAIN/bin/$TARGET$TARGET_API-ranlib ];then
ln -s $TOOLCHAIN/bin/llvm-ar $TOOLCHAIN/bin/$TARGET$TARGET_API-ranlib
fi
echo "---------------------------"
echo " > start to build ARM64."
echo "---------------------------"
cd $CURRENT_PATH/build/android
cmake -DCMAKE_TOOLCHAIN_FILE=$NDKROOT_PATH/build/cmake/android.toolchain.cmake \
-DCMAKE_INSTALL_PREFIX=$PREFIX \
-DANDROID_ABI=$TARGET_ABI \
-DANDROID_NATIVE_API_LEVEL=$TARGET_API \
-DCMAKE_BUILD_TYPE=Release\
-DANDROID_TOOLCHAIN=clang \
-Dprotobuf_BUILD_TESTS=OFF \
-Dprotobuf_BUILD_SHARED_LIBS=ON \
../../cmake/
#-DANDROID_PLATFORM=$TARGET_ANDROID_PLATFORM
#如果编译静态库,则拿掉该项配置
#-Dprotobuf_BUILD_SHARED_LIBS=ON
make
make install
echo "---------------------------"
echo " > build finished."
echo "---------------------------"
cd $CURRENT_PATH
3.2 QNX交叉编译脚本
build_qnx.sh
#!/bin/sh
###################################
#### build script for protobuf
#### taget:qnx
#### Date: 2022-11-01
#### Author: 村里小码农
###################################
# qnx tools dir
QNX_TOOLS_PATH=/workspace/tools/prebuilt_QNX700
# current dir
CURRENT_PATH=$(pwd)
#
TARGET_ABI=aarch64le
#
PREFIX=$CURRENT_PATH/build/qnx/$TARGET_ABI
if [ -d $PREFIX ];then
rm -rf $PREFIX
mkdir -p $PREFIX
else
mkdir -p $PREFIX
fi
export QNX_CONFIGURATION=$QNX_TOOLS_PATH/.qnx
export QNX_TARGET=$QNX_TOOLS_PATH/target/qnx7
export QNX_HOST=$QNX_TOOLS_PATH/host/linux/x86_64
export MAKEFLAGS=-I$QNX_TOOLS_PATH/target/qnx7/usr/include
export MAKELDFLAGS=-L$QNX_TOOLS_PATH/target/qnx7/usr/lib,-L$QNX_TOOLS_PATH/target/qnx7/aarch64le/lib
#QNX_TOOLCHAINS_CC64=$QNX_TOOLS_PATH/host/linux/x86_64/usr/bin/ntoaarch64-gcc
#QNX_TOOLCHAINS_CXX64=$QNX_TOOLS_PATH/host/linux/x86_64/usr/bin/ntoaarch64-g++
#use aarch64-unknown-nto-qnx7.0.0
QNX_TOOLCHAINS_CC64=$QNX_TOOLS_PATH/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.0.0-gcc
QNX_TOOLCHAINS_CXX64=$QNX_TOOLS_PATH/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.0.0-g++
echo "---------------------------"
echo " > start to build ARM64."
echo "---------------------------"
./configure --prefix=$PREFIX \
--host=aarch64-unknown-nto-qnx7.0.0 \
--build=x86_64-pc-linux \
CC=$QNX_TOOLCHAINS_CC64 \
CXX=$QNX_TOOLCHAINS_CXX64 \
CPPFLAGS='-D_XOPEN_SOURCE=500'
#--disable-shared
make -j12
make install
echo "---------------------------"
echo " > build finished."
echo "---------------------------"
cd $CURRENT_PATH