• 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

    1. #!/bin/sh
    2. ###################################
    3. #### build script for fdbus
    4. #### taget:qnx
    5. #### Date: 2022-11-01
    6. #### Author: 村里小码农
    7. ###################################
    8. # qnx tools dir
    9. QNX_TOOLS_PATH=/workspace/tools/prebuilt_QNX700
    10. # current dir
    11. CURRENT_PATH=$(pwd)
    12. PREFIX=$CURRENT_PATH/build/qnx/install
    13. PROTOBUF=$CURRENT_PATH/../protobuf-3.20.2
    14. mkdir -p $PREFIX
    15. export QNX_CONFIGURATION=$QNX_TOOLS_PATH/.qnx
    16. export QNX_TARGET=$QNX_TOOLS_PATH/target/qnx7
    17. export QNX_HOST=$QNX_TOOLS_PATH/host/linux/x86_64
    18. export MAKEFLAGS=-I$QNX_TOOLS_PATH/target/qnx7/usr/include
    19. export MAKELDFLAGS=-L$QNX_TOOLS_PATH/target/qnx7/usr/lib,-L$QNX_PREBUILT/target/qnx7/aarch64le/lib
    20. #QNX_TOOLCHAINS_CC64=$QNX_TOOLS_PATH/host/linux/x86_64/usr/bin/ntoaarch64-gcc
    21. #QNX_TOOLCHAINS_CXX64=$QNX_TOOLS_PATH/host/linux/x86_64/usr/bin/ntoaarch64-g++
    22. #use aarch64-unknown-nto-qnx7.0.0
    23. QNX_TOOLCHAINS_CC64=$QNX_TOOLS_PATH/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.0.0-gcc
    24. QNX_TOOLCHAINS_CXX64=$QNX_TOOLS_PATH/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.0.0-g++
    25. export PATH=$PROTOBUF/build/qnx/install/bin:$PATH
    26. export LD_LIBRARY_PATH=$PROTOBUF/build/qnx/install/lib:$LD_LIBRARY_PATH
    27. cd $CURRENT_PATH/build/qnx/
    28. echo "---------------------------"
    29. echo " > start to build fdbus."
    30. echo "---------------------------"
    31. cmake -DCMAKE_INSTALL_PREFIX=$PREFIX \
    32. -DSYSTEM_ROOT=$PROTOBUF/build/qnx/install \
    33. -DCMAKE_TOOLCHAIN_FILE=../../cmake/toolchain.cmake \
    34. -Dfdbus_QNX=ON \
    35. -Dfdbus_LOG_TO_STDOUT=ON \
    36. -Dfdbus_SOCKET_ENABLE_PEERCRED=OFF \
    37. -Dfdbus_PIPE_AS_EVENTFD=ON \
    38. -Dfdbus_LINK_SOCKET_LIB=ON \
    39. -Dfdbus_SOCKET_QNX_PEERCRED=ON \
    40. -Dfdbus_QNX_DIRENT=ON \
    41. -Dfdbus_QNX_KEEPALIVE=ON \
    42. -Dfdbus_CONFIG_NO_IFADDR=ON \
    43. -Dfdbus_LINK_PTHREAD_LIB=OFF \
    44. ../../cmake
    45. #-DSYSTEM_ROOT=$PROTOBUF/out/qnx/
    46. # -Dfdbus_QNX_KEEPALIVE=ON
    47. # -Dfdbus_SOCKET_QNX_PEERCRED=ON
    48. # -DCMAKE_CXX_FLAGS='-O2 -g -Os -Wall -fstack-protector-strong -DGOOGLE_PROTOBUF_ARCH_64_BIT'
    49. # -DCMAKE_C_FLAGS='-O2 -g -Os -Wall -fstack-protector-strong'
    50. make
    51. make install
    52. echo "---------------------------"
    53. echo " > build finished."
    54. echo "---------------------------"
    55. cd ${CURRENT_PATH}

    修改 cmake/toolschain.cmake

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

    编译成功:

    1. ── qnx
    2. ├── CMakeCache.txt
    3. ├── CMakeFiles
    4. │   ├── 3.16.3
    5. │   ├── cmake.check_cache
    6. │   ├── CMakeDirectoryInformation.cmake
    7. │   ├── CMakeOutput.log
    8. │   ├── CMakeRuleHashes.txt
    9. │   ├── CMakeTmp
    10. │   ├── common_base.dir
    11. │   ├── fdbus-clib.dir
    12. │   ├── fdbxclient.dir
    13. │   ├── fdbxserver.dir
    14. │   ├── host_server.dir
    15. │   ├── logsvc.dir
    16. │   ├── logviewer.dir
    17. │   ├── lsclt.dir
    18. │   ├── lsevt.dir
    19. │   ├── lshost.dir
    20. │   ├── lssvc.dir
    21. │   ├── Makefile2
    22. │   ├── Makefile.cmake
    23. │   ├── name_server.dir
    24. │   ├── ntfcenter.dir
    25. │   ├── progress.marks
    26. │   ├── TargetDirectories.txt
    27. │   └── uninstall.dir
    28. ├── cmake_install.cmake
    29. ├── cmake_uninstall.cmake
    30. ├── fdbxclient
    31. ├── fdbxserver
    32. ├── host_server
    33. ├── install
    34. │   └── usr
    35. ├── install_manifest.txt
    36. ├── libcommon_base.so
    37. ├── libfdbus-clib.so
    38. ├── logsvc
    39. ├── logviewer
    40. ├── lsclt
    41. ├── lsevt
    42. ├── lshost
    43. ├── lssvc
    44. ├── Makefile
    45. ├── name_server
    46. └── ntfcenter

    3.2 NDK交叉编译脚本

    build_android.sh

    1. #!/bin/sh
    2. ###################################
    3. #### build script for protobuf
    4. #### taget:qnx
    5. #### Date: 2022-11-01
    6. #### Author: 村里小码农
    7. ###################################
    8. # qnx bsp dir
    9. NDKROOT_PATH=/workspace/tools/android-ndk-r23b
    10. TOOLCHAIN=$NDKROOT_PATH/toolchains/llvm/prebuilt/linux-x86_64
    11. # current dir
    12. CURRENT_PATH=$(pwd)
    13. # config Compile param.
    14. TARGET_API=28
    15. #
    16. TARGET_ANDROID_PLATFORM=android-$TARGET_API
    17. #预留
    18. TARGET=aarch64-linux-android
    19. #TARGET_ABI=armeabi-v7a
    20. TARGET_ABI=arm64-v8a
    21. PREFIX=$CURRENT_PATH/build/android/install
    22. PROTOBUF=$CURRENT_PATH/../protobuf-3.20.2
    23. export PATH=$PROTOBUF/build/android/install/bin:$PATH
    24. export LD_LIBRARY_PATH=$PROTOBUF/build/android/install/lib:$LD_LIBRARY_PATH
    25. if [ -d $PREFIX ];then
    26. rm -rf $PREFIX
    27. mkdir -p $PREFIX
    28. else
    29. mkdir -p $PREFIX
    30. fi
    31. if [ ! -f $TOOLCHAIN/bin/$TARGET$TARGET_API-ar ];then
    32. ln -s $TOOLCHAIN/bin/llvm-ar $TOOLCHAIN/bin/$TARGET$TARGET_API-ar
    33. fi
    34. if [ ! -f $TOOLCHAIN/bin/$TARGET$TARGET_API-nm ];then
    35. ln -s $TOOLCHAIN/bin/llvm-nm $TOOLCHAIN/bin/$TARGET$TARGET_API-nm
    36. fi
    37. if [ ! -f $TOOLCHAIN/bin/$TARGET$TARGET_API-ranlib ];then
    38. ln -s $TOOLCHAIN/bin/llvm-ar $TOOLCHAIN/bin/$TARGET$TARGET_API-ranlib
    39. fi
    40. echo "---------------------------"
    41. echo " > start to build ARM64."
    42. echo "---------------------------"
    43. cd $CURRENT_PATH/build/android
    44. cmake -DCMAKE_TOOLCHAIN_FILE=$NDKROOT_PATH/build/cmake/android.toolchain.cmake \
    45. -DCMAKE_INSTALL_PREFIX=$PREFIX \
    46. -DSYSTEM_ROOT=$PROTOBUF/build/android/install \
    47. -DANDROID_ABI=$TARGET_ABI \
    48. -DANDROID_NATIVE_API_LEVEL=$TARGET_API \
    49. -DCMAKE_BUILD_TYPE=Release\
    50. -DANDROID_TOOLCHAIN=clang \
    51. -Dfdbus_ANDROID=ON \
    52. -Dfdbus_LOG_TO_STDOUT=ON \
    53. -Dfdbus_CONFIG_NO_IFADDR=ON \
    54. -Dfdbus_LINK_PTHREAD_LIB=OFF \
    55. ../../cmake/
    56. make
    57. make install
    58. echo "---------------------------"
    59. echo " > build finished."
    60. echo "---------------------------"
    61. 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:

    1. if(fdbus_ANDROID)
    2. link_libraries(log)
    3. endif()

    再次编译:

    ./build_android.sh 

    编译OK

    1. ├── android
    2. │   ├── arm64-v8a
    3. │   │   └── usr
    4. │   ├── CMakeCache.txt
    5. │   ├── CMakeFiles
    6. │   │   ├── 3.16.3
    7. │   │   ├── cmake.check_cache
    8. │   │   ├── CMakeDirectoryInformation.cmake
    9. │   │   ├── CMakeOutput.log
    10. │   │   ├── CMakeRuleHashes.txt
    11. │   │   ├── CMakeTmp
    12. │   │   ├── common_base.dir
    13. │   │   ├── fdbus-clib.dir
    14. │   │   ├── fdbxclient.dir
    15. │   │   ├── fdbxserver.dir
    16. │   │   ├── host_server.dir
    17. │   │   ├── logsvc.dir
    18. │   │   ├── logviewer.dir
    19. │   │   ├── lsclt.dir
    20. │   │   ├── lsevt.dir
    21. │   │   ├── lshost.dir
    22. │   │   ├── lssvc.dir
    23. │   │   ├── Makefile2
    24. │   │   ├── Makefile.cmake
    25. │   │   ├── name_server.dir
    26. │   │   ├── ntfcenter.dir
    27. │   │   ├── progress.marks
    28. │   │   ├── TargetDirectories.txt
    29. │   │   └── uninstall.dir
    30. │   ├── cmake_install.cmake
    31. │   ├── cmake_uninstall.cmake
    32. │   ├── fdbxclient
    33. │   ├── fdbxserver
    34. │   ├── host_server
    35. │   ├── install_manifest.txt
    36. │   ├── libcommon_base.so
    37. │   ├── libfdbus-clib.so
    38. │   ├── logsvc
    39. │   ├── logviewer
    40. │   ├── lsclt
    41. │   ├── lsevt
    42. │   ├── lshost
    43. │   ├── lssvc
    44. │   ├── Makefile
    45. │   ├── name_server
    46. │   └── ntfcenter

    3.3  QNX测试

    3.4 Android端测试

  • 相关阅读:
    如何写好github上的README
    数据中台、BI业务访谈(二):组织架构梳理的坑
    【MySQL】——Select查询语句知识点练习(其一)
    (十三)【Jmeter】线程(Threads(Users))之tearDown 线程组
    Java面向对象16:接口的定义与实现
    C/C++中的协程
    C# 第五章『面向对象』◆第2节:类和修饰符
    解决 Spring Boot 与 springfox 的 NullPointerException 问题
    你要了解,哪些财产不属于夫妻共同财产
    从Unreal的Cast函数探寻反射系统父子关系的建立过程
  • 原文地址:https://blog.csdn.net/liaochaoyun/article/details/127670594