FDbus NDK以及QNX交叉编译

1. 背景

fdbus 可以这讲,就是一个定制化的RPC,可以用于进程间通信,以及双系统间通信。

TODO

2. 下载资源

fdbus镜像地址:fdbus

Android ndk下载:Android ndk

QNX tools下载: prebuilt_QNX700

下载完,解压!

TODO

3.  实操

废话不多数,直接上编译脚本

3.1  QNX交叉编译脚本

build_qnx.sh

#!/bin/sh
###################################
#### build script for fdbus
#### taget:qnx
#### Date: 2022-11-01
#### Author: 村里小码农
###################################

# qnx tools dir
QNX_TOOLS_PATH=/workspace/tools/prebuilt_QNX700
# current dir
CURRENT_PATH=$(pwd)

PREFIX=$CURRENT_PATH/build/qnx/install
PROTOBUF=$CURRENT_PATH/../protobuf-3.20.2

mkdir -p $PREFIX

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_PREBUILT/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++
export PATH=$PROTOBUF/build/qnx/install/bin:$PATH
export LD_LIBRARY_PATH=$PROTOBUF/build/qnx/install/lib:$LD_LIBRARY_PATH

cd $CURRENT_PATH/build/qnx/

echo "---------------------------"
echo " > start to build fdbus."
echo "---------------------------"

cmake -DCMAKE_INSTALL_PREFIX=$PREFIX \
	-DSYSTEM_ROOT=$PROTOBUF/build/qnx/install \
	-DCMAKE_TOOLCHAIN_FILE=../../cmake/toolchain.cmake \
	-Dfdbus_QNX=ON \
	-Dfdbus_LOG_TO_STDOUT=ON \
	-Dfdbus_SOCKET_ENABLE_PEERCRED=OFF \
	-Dfdbus_PIPE_AS_EVENTFD=ON \
	-Dfdbus_LINK_SOCKET_LIB=ON \
	-Dfdbus_SOCKET_QNX_PEERCRED=ON \
	-Dfdbus_QNX_DIRENT=ON \
	-Dfdbus_QNX_KEEPALIVE=ON \
	-Dfdbus_CONFIG_NO_IFADDR=ON \
	-Dfdbus_LINK_PTHREAD_LIB=OFF \
	../../cmake

#-DSYSTEM_ROOT=$PROTOBUF/out/qnx/
#	-Dfdbus_QNX_KEEPALIVE=ON
#	-Dfdbus_SOCKET_QNX_PEERCRED=ON
#    -DCMAKE_CXX_FLAGS='-O2 -g -Os -Wall -fstack-protector-strong -DGOOGLE_PROTOBUF_ARCH_64_BIT'
#    -DCMAKE_C_FLAGS='-O2 -g -Os -Wall -fstack-protector-strong'
make
make install

echo "---------------------------"
echo " >   build finished."
echo "---------------------------"

cd ${CURRENT_PATH}

修改 cmake/toolschain.cmake

SET(CMAKE_SYSTEM_NAME qnx)
SET(QNX_TOOLS_PATH /workspace/tools/prebuilt_QNX700)
SET(CMAKE_CXX_COMPILER ${QNX_TOOLS_PATH}/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.0.0-g++)
SET(CMAKE_C_COMPILER ${QNX_TOOLS_PATH}/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.0.0-gcc)

编译成功:

── qnx
    ├── CMakeCache.txt
    ├── CMakeFiles
    │   ├── 3.16.3
    │   ├── cmake.check_cache
    │   ├── CMakeDirectoryInformation.cmake
    │   ├── CMakeOutput.log
    │   ├── CMakeRuleHashes.txt
    │   ├── CMakeTmp
    │   ├── common_base.dir
    │   ├── fdbus-clib.dir
    │   ├── fdbxclient.dir
    │   ├── fdbxserver.dir
    │   ├── host_server.dir
    │   ├── logsvc.dir
    │   ├── logviewer.dir
    │   ├── lsclt.dir
    │   ├── lsevt.dir
    │   ├── lshost.dir
    │   ├── lssvc.dir
    │   ├── Makefile2
    │   ├── Makefile.cmake
    │   ├── name_server.dir
    │   ├── ntfcenter.dir
    │   ├── progress.marks
    │   ├── TargetDirectories.txt
    │   └── uninstall.dir
    ├── cmake_install.cmake
    ├── cmake_uninstall.cmake
    ├── fdbxclient
    ├── fdbxserver
    ├── host_server
    ├── install
    │   └── usr
    ├── install_manifest.txt
    ├── libcommon_base.so
    ├── libfdbus-clib.so
    ├── logsvc
    ├── logviewer
    ├── lsclt
    ├── lsevt
    ├── lshost
    ├── lssvc
    ├── Makefile
    ├── name_server
    └── ntfcenter

3.2 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/install
PROTOBUF=$CURRENT_PATH/../protobuf-3.20.2

export PATH=$PROTOBUF/build/android/install/bin:$PATH
export LD_LIBRARY_PATH=$PROTOBUF/build/android/install/lib:$LD_LIBRARY_PATH

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 \
	-DSYSTEM_ROOT=$PROTOBUF/build/android/install \
        -DANDROID_ABI=$TARGET_ABI \
        -DANDROID_NATIVE_API_LEVEL=$TARGET_API \
        -DCMAKE_BUILD_TYPE=Release\
        -DANDROID_TOOLCHAIN=clang \
	-Dfdbus_ANDROID=ON \
	-Dfdbus_LOG_TO_STDOUT=ON \
	-Dfdbus_CONFIG_NO_IFADDR=ON \
	-Dfdbus_LINK_PTHREAD_LIB=OFF \
	../../cmake/

make
make install

echo "---------------------------"
echo " >   build finished."
echo "---------------------------"
cd $CURRENT_PATH

如上,但是ndk编译会报错。 //如下信息

ld: error: undefined symbol: __android_log_print
>>> referenced by CBaseClient.cpp:101 

.....
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
CMakeFiles/common_base.dir/build.make:533: recipe for target 'libcommon_base.so' failed
make[2]: *** [libcommon_base.so] Error 1
CMakeFiles/Makefile2:262: recipe for target 'CMakeFiles/common_base.dir/all' failed
make[1]: *** [CMakeFiles/common_base.dir/all] Error 2
Makefile:129: recipe for target 'all' failed
make: *** [all] Error 2

没关系,一看是缺少链接库log导致的

那么修改cmake/CMakeLists.txt

增加如下code:

	if(fdbus_ANDROID)
		link_libraries(log)
	endif()

再次编译:

./build_android.sh 

编译OK

├── android
│   ├── arm64-v8a
│   │   └── usr
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   │   ├── 3.16.3
│   │   ├── cmake.check_cache
│   │   ├── CMakeDirectoryInformation.cmake
│   │   ├── CMakeOutput.log
│   │   ├── CMakeRuleHashes.txt
│   │   ├── CMakeTmp
│   │   ├── common_base.dir
│   │   ├── fdbus-clib.dir
│   │   ├── fdbxclient.dir
│   │   ├── fdbxserver.dir
│   │   ├── host_server.dir
│   │   ├── logsvc.dir
│   │   ├── logviewer.dir
│   │   ├── lsclt.dir
│   │   ├── lsevt.dir
│   │   ├── lshost.dir
│   │   ├── lssvc.dir
│   │   ├── Makefile2
│   │   ├── Makefile.cmake
│   │   ├── name_server.dir
│   │   ├── ntfcenter.dir
│   │   ├── progress.marks
│   │   ├── TargetDirectories.txt
│   │   └── uninstall.dir
│   ├── cmake_install.cmake
│   ├── cmake_uninstall.cmake
│   ├── fdbxclient
│   ├── fdbxserver
│   ├── host_server
│   ├── install_manifest.txt
│   ├── libcommon_base.so
│   ├── libfdbus-clib.so
│   ├── logsvc
│   ├── logviewer
│   ├── lsclt
│   ├── lsevt
│   ├── lshost
│   ├── lssvc
│   ├── Makefile
│   ├── name_server
│   └── ntfcenter

3.3  QNX测试

3.4 Android端测试

猜你喜欢

转载自blog.csdn.net/liaochaoyun/article/details/127670594