libevent之android与鸿蒙编译过程

打印 上一主题 下一主题

主题 513|帖子 513|积分 1549

背景

    近来基于libevent开发了一个端侧的缓存代理库,先是基于macOS编译开发的,基本0问题,后来移植到鸿蒙与android时遇到一些编译链接问题。
    libevent版本如下:
软件版本号libevent-2.1.8
android编译

编译环境

android studio版本ndk编译链版本api级别
Android Studio Flamingo | 2022.2.1 Patch 2
Build #AI-222.4459.24.2221.10121639, built on May 12, 2023
Runtime version: 17.0.6+0-17.0.6b802.4-9586694 aarch64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
macOS 14.3.1
GC: G1 Young Generation, G1 Old Generation
Memory: 2048M
Cores: 10
Metal Rendering is ON
Registry:
    external.system.auto.import.disabled=true
    ide.text.editor.with.preview.show.floating.toolbar=false
    ide.instant.shutdown=false
    gradle.version.catalogs.dynamic.support=true
Non-Bundled Plugins:
    OpenGL-Plugin (1.0.73)
    Dart (222.4582)
    com.localizely.flutter-intl (1.18.3-2022.2)
    io.flutter (74.0.2)
 
~/Library/Android/sdk/ndk/22.1.717167028
问题征象

  1. ld: error: undefined symbol: arc4random_addrandom
  2. >>> referenced by evutil_rand.c
  3. >>>               evutil_rand.o:(evutil_secure_rng_add_bytes) in archive ./.libs/libevent.a
  4. clang: error: linker command failed with exit code 1 (use -v to see invocation)
  5. make[1]: *** [sample/dns-example] Error 1
  6. make: *** [all] Error 2
  7. /Applications/Xcode.app/Contents/Developer/usr/bin/make  install-am
  8.   CCLD     sample/dns-example
  9. ld: error: undefined symbol: arc4random_addrandom
  10. >>> referenced by evutil_rand.c
  11. >>>               evutil_rand.o:(evutil_secure_rng_add_bytes) in archive ./.libs/libevent.a
  12. clang: error: linker command failed with exit code 1 (use -v to see invocation)
  13. make[1]: *** [sample/dns-example] Error 1
  14. make: *** [install] Error 2
复制代码
办理办法

    找到evutil_rand.c文件,将以下代码注释掉即可:
  1. // void
  2. // evutil_secure_rng_add_bytes(const char *buf, size_t n)
  3. // {
  4. //         arc4random_addrandom((unsigned char*)buf,
  5. //             n>(size_t)INT_MAX ? INT_MAX : (int)n);
  6. // }
复制代码
    贴出android下编译libevent为arm64和armv7a架构的shell脚本: 
  1. #!/bin/bash
  2. #根据实际安装位置修改
  3. export ANDROID_NDK_HOME=/Users/mingo/Library/Android/sdk/ndk/21.1.6352462
  4. export TOOLCHAIN_DIR=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64
  5. export SYSROOT=$TOOLCHAIN_DIR/sysroot
  6. export TARGET_ARCH=aarch64-linux-android
  7. export TOOLCHAIN=$TOOLCHAIN_DIR
  8. export API_LEVEL=21
  9. TARGET=aarch64-linux-android${API_LEVEL}
  10. export CLANG="$TOOLCHAIN/bin/aarch64-linux-android$API_LEVEL-clang"
  11. export CLANGXX="$TOOLCHAIN/bin/aarch64-linux-android$API_LEVEL-clang++"
  12. export AR="$TOOLCHAIN/bin/aarch64-linux-android-ar"
  13. export LD="$TOOLCHAIN/bin/aarch64-linux-android-ld"
  14. export RANLIB="$TOOLCHAIN/bin/aarch64-linux-android-ranlib"
  15. export STRIP="$TOOLCHAIN/bin/aarch64-linux-android-strip"
  16. #根据实际安装位置修改
  17. OPENSSL_OUTPUT=/Users/mingo/Applications/workspace/opensrc/openssl-android/android
  18. OPENSSL_DIR=${OPENSSL_OUTPUT}/aarch64
  19. PKG_CONFIG_PATH="$OPENSSL_DIR/lib/pkgconfig"
  20. CFLAGS="--sysroot=$SYSROOT -I$OPENSSL_DIR/include --target=$TARGET -fPIC -DEVUTIL_DISABLE_ARC4RANDOM"
  21. LDFLAGS="--sysroot=$SYSROOT -L$OPENSSL_DIR/lib -lz -lc"
  22. OUTPUT_DIR=$(pwd)/android/$TARGET_ARCH
  23. mkdir -p ${OUTPUT_DIR}
  24. function build() {
  25.     ./configure --host=$TARGET_ARCH --prefix=$OUTPUT_DIR \
  26.         --with-sysroot=${SYSROOT} \
  27.         --with-openssl=$OPENSSL_DIR \
  28.         --disable-shared \
  29.         --disable-arc4random \
  30.         CC=$CLANG \
  31.         CXX=$CLANGXX \
  32.         AR=$AR \
  33.         RANLIB=$RANLIB \
  34.         CFLAGS="$CFLAGS" \
  35.         LDFLAGS="$LDFLAGS"
  36.     make clean
  37.     make j8
  38.     make install
  39. }
  40. build
  41. TARGET_ARCH=arm-linux-androideabi
  42. TARGET=arm-linux-android${API_LEVEL}
  43. OUTPUT_DIR=$(pwd)/android/$TARGET_ARCH
  44. mkdir -p ${OUTPUT_DIR}
  45. OPENSSL_DIR=${OPENSSL_OUTPUT}/armv7a
  46. PKG_CONFIG_PATH="$OPENSSL_DIR/lib/pkgconfig"
  47. CFLAGS="--sysroot=$SYSROOT -I$OPENSSL_DIR/include --target=$TARGET -fPIC -DEVUTIL_DISABLE_ARC4RANDOM"
  48. LDFLAGS="--sysroot=$SYSROOT -L$OPENSSL_DIR/lib -lz"
  49. build
复制代码
openssl编译 

  1. #!/bin/bash
  2. #根据实际安装位置修改
  3. export ANDROID_NDK_HOME=/Users/mingo/Library/Android/sdk/ndk/21.1.6352462
  4. export TOOLCHAIN_DIR=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64
  5. export PATH=$TOOLCHAIN_DIR/bin:$PATH
  6. export TARGET_ARCH=aarch64
  7. export API_LEVEL=21  # Android 5.0 (Lollipop)
  8. export CC="$TOOLCHAIN_DIR/bin/aarch64-linux-android$API_LEVEL-clang"
  9. export CXX="$TOOLCHAIN_DIR/bin/aarch64-linux-android$API_LEVEL-clang++"
  10. export AR="$TOOLCHAIN_DIR/bin/aarch64-linux-android-ar"
  11. export AS="$TOOLCHAIN_DIR/bin/aarch64-linux-android-as"
  12. export LD="$TOOLCHAIN_DIR/bin/aarch64-linux-android-ld"
  13. export RANLIB="$TOOLCHAIN_DIR/bin/aarch64-linux-android-ranlib"
  14. export STRIP="$TOOLCHAIN_DIR/bin/aarch64-linux-android-strip"
  15. function build() {
  16.     make clean
  17.     OUTPUT_DIR=$(pwd)/android/$TARGET_ARCH
  18.     mkdir -p ${OUTPUT_DIR}
  19.     #config for android arm64
  20.     ./Configure ${TARGET} -D__ANDROID_API__=${API_LEVEL} no-asm zlib no-shared no-ssl2 no-ssl3 no-comp no-hw no-engine --prefix=${OUTPUT_DIR}
  21.     make -j8
  22.     make install
  23. }
  24. TARGET=android-arm64
  25. build
  26. export TARGET_ARCH=armv7a
  27. export TARGET_HOST=armv7a-linux-androideabi
  28. export CC="$TOOLCHAIN_DIR/bin/${TARGET_HOST}${API_LEVEL}-clang"
  29. export CXX="$TOOLCHAIN_DIR/bin/${TARGET_HOST}${API_LEVEL}-clang++"
  30. export AR="$TOOLCHAIN_DIR/bin/${TARGET_HOST}-ar"
  31. export AS="$TOOLCHAIN_DIR/bin/${TARGET_HOST}-as"
  32. export LD="$TOOLCHAIN_DIR/bin/${TARGET_HOST}-ld"
  33. export RANLIB="$TOOLCHAIN_DIR/bin/${TARGET_HOST}-ranlib"
  34. export STRIP="$TOOLCHAIN_DIR/bin/${TARGET_HOST}-strip"
  35. TARGET=android-arm
  36. build
复制代码
注意
1)在一个app项目里,ndk编译的时候要记得android api级别要一致,就好比本文app的android api级别要求位21,那么在编译libevent和openssl的时候,都要调整为21方可。 
鸿蒙编译

编译环境

DevEco版本编译链版本api级别
DevEco Studio NEXT Developer Beta3
Build #DS-233.14475.28.36.503600
Build Version: 5.0.3.600, built on August 7, 2024
Runtime version: 17.0.10+1-b1087.17 aarch64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
macOS 14.3.1
GC: G1 Young Generation, G1 Old Generation
Memory: 2048M
Cores: 10
Metal Rendering is ON
Registry:
  idea.plugins.compatible.build=IC-233.14475.28
 
~/Library/OpenHarmony/Sdk/1212
    先是到华为官网下载DevEco IDE开发工具,ID安装好后,再安装鸿蒙编译链,选择api 12的ndk版本进行安装:
下载中心 | 华为开发者联盟-HarmonyOS开发者官网,共建鸿蒙生态

    编译链安装完毕,本文默认安装在以下目录: 
  1. mingo@localhost:~/Library/OpenHarmony/Sdk/12$pwd
  2. /Users/mingo/Library/OpenHarmony/Sdk/12
  3. mingo@localhost:~/Library/OpenHarmony/Sdk/12$tree -L 2
  4. .
  5. ├── native
  6. │   ├── NOTICE.txt
  7. │   ├── build
  8. │   ├── build-tools
  9. │   ├── llvm
  10. │   ├── nativeapi_syscap_config.json
  11. │   ├── ndk_system_capability.json
  12. │   ├── oh-uni-package.json
  13. │   └── sysroot
  14. └── toolchains
  15.     ├── NOTICE.txt
  16.     ├── ark_disasm
  17.     ├── configcheck
  18.     ├── diff
  19.     ├── hdc
  20.     ├── hnpcli
  21.     ├── id_defined.json
  22.     ├── idl
  23.     ├── lib
  24.     ├── libusb_shared.dylib
  25.     ├── modulecheck
  26.     ├── oh-uni-package.json
  27.     ├── restool
  28.     ├── syscap_tool
  29.     └── syscapcheck
  30. 11 directories, 15 files
复制代码
编译脚本 

    编译链安装完毕,便可以利用该工具链进行编译了,贴出完整编译脚本: 
  1. #!/bin/bash
  2. set -e
  3. # 根据实际位置修改
  4. HARMONY_SDK_PATH=/Users/mingo/Library/OpenHarmony/Sdk/12
  5. CLANG=$HARMONY_SDK_PATH/native/llvm/bin/clang
  6. CLANGXX=$HARMONY_SDK_PATH/native/llvm/bin/clang++
  7. AR=$HARMONY_SDK_PATH/native/llvm/bin/llvm-ar
  8. RANLIB=$HARMONY_SDK_PATH/native/llvm/bin/llvm-ranlib
  9. # compile for aarch64
  10. TARGET_ARCH=aarch64-linux-gnu
  11. TARGET=aarch64-linux-ohos
  12. SYSROOT=$HARMONY_SDK_PATH/native/sysroot
  13. ZLIB_ROOT_PATH=${HARMONY_SDK_PATH}/native/sysroot/usr
  14. ZLIB_INCLUDE_PATH=${ZLIB_ROOT_PATH}/include
  15. ZLIB_LIB_PATH=${ZLIB_ROOT_PATH}/lib/aarch64-linux-ohos
  16. # 根据实际位置修改
  17. OPENSSL_DIR=/Users/mingo/Applications/workspace/opensrc/openssl/hmos/aarch64
  18. PKG_CONFIG_PATH="$OPENSSL_DIR/lib/pkgconfig"
  19. CPPFLAGS="-I$OPENSSL_DIR/include -I${ZLIB_INCLUDE_PATH}"
  20. SYSLIB_INCLUDE_DIR=${SYSROOT}/usr/include/aarch64-linux-ohos
  21. echo "syslib=$SYSLIB_INCLUDE_DIR"
  22. CFLAGS="--sysroot=$SYSROOT -I$SYSLIB_INCLUDE_DIR -I$OPENSSL_DIR/include -I$ZLIB_INCLUDE_PATH --target=$TARGET -fPIC"
  23. #CFLAGS="--sysroot=$SYSROOT -I$SYSLIB_INCLUDE_DIR -I$ZLIB_INCLUDE_PATH --target=$TARGET -fPIC"
  24. LDFLAGS="--sysroot=$SYSROOT -L$OPENSSL_DIR/lib -L$ZLIB_LIB_PATH -lz"
  25. export CC=$CLANG
  26. export CXX=$CLANGXX
  27. export AR=$AR
  28. export RANLIB=$RANLIB
  29. export CFLAGS=$CFLAGS
  30. export LDFLAGS=$LDFLAGS
  31. # compile for libevent-2.1.8-stable
  32. LIBEVENT_SRC_PATH=`pwd`/libevent-2.1.8-stable
  33. cd $LIBEVENT_SRC_PATH
  34. PREFIX=${LIBEVENT_SRC_PATH}/ohos/aarch64
  35. mkdir -p ${PREFIX}
  36. function build_event() {
  37.     make clean
  38.     make distclean
  39.     ./configure --host=$TARGET_ARCH --prefix=$PREFIX \
  40.         --with-sysroot=${SYSLIB_INCLUDE_DIR} \
  41.         --with-openssl=$OPENSSL_DIR \
  42.         --with-zlib=$ZLIB_ROOT_PATH \
  43.                 --disable-shared \
  44.         CC=$CLANG \
  45.         CXX=$CLANGXX \
  46.         AR=$AR \
  47.         RANLIB=$RANLIB \
  48.         CFLAGS="$CFLAGS" \
  49.         LDFLAGS="$LDFLAGS"
  50.     make verbose=1
  51.     make install
  52.     cd ..
  53. }
  54. build_event
复制代码
提示:鸿蒙编译链编译libevent的时候,先是下载的api=10的编译链,但在找系统库文件的时候找不到,于是切到api=12级别的编译链,可顺遂编译出所需静态库。 
openssl编译
  1. #!/bin/bash
  2. export ANDROID_NDK_HOME=/Users/mingo/Library/Android/sdk/ndk/21.1.6352462
  3. export TOOLCHAIN_DIR=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64
  4. export PATH=$TOOLCHAIN_DIR/bin:$PATH
  5. export TARGET_ARCH=aarch64
  6. export API_LEVEL=21  # Android 5.0 (Lollipop)
  7. export CC="$TOOLCHAIN_DIR/bin/aarch64-linux-android$API_LEVEL-clang"
  8. export CXX="$TOOLCHAIN_DIR/bin/aarch64-linux-android$API_LEVEL-clang++"
  9. export AR="$TOOLCHAIN_DIR/bin/aarch64-linux-android-ar"
  10. export AS="$TOOLCHAIN_DIR/bin/aarch64-linux-android-as"
  11. export LD="$TOOLCHAIN_DIR/bin/aarch64-linux-android-ld"
  12. export RANLIB="$TOOLCHAIN_DIR/bin/aarch64-linux-android-ranlib"
  13. export STRIP="$TOOLCHAIN_DIR/bin/aarch64-linux-android-strip"
  14. function build() {
  15.     make clean
  16.     OUTPUT_DIR=$(pwd)/android/$TARGET_ARCH
  17.     mkdir -p ${OUTPUT_DIR}
  18.     #config for android arm64
  19.     ./Configure ${TARGET} -D__ANDROID_API__=${API_LEVEL} no-asm zlib no-shared no-ssl2 no-ssl3 no-comp no-hw no-engine --prefix=${OUTPUT_DIR}
  20.     make -j8
  21.     make install
  22. }
  23. TARGET=android-arm64
  24. build
  25. export TARGET_ARCH=armv7a
  26. export TARGET_HOST=armv7a-linux-androideabi
  27. export CC="$TOOLCHAIN_DIR/bin/${TARGET_HOST}${API_LEVEL}-clang"
  28. export CXX="$TOOLCHAIN_DIR/bin/${TARGET_HOST}${API_LEVEL}-clang++"
  29. export AR="$TOOLCHAIN_DIR/bin/${TARGET_HOST}-ar"
  30. export AS="$TOOLCHAIN_DIR/bin/${TARGET_HOST}-as"
  31. export LD="$TOOLCHAIN_DIR/bin/${TARGET_HOST}-ld"
  32. export RANLIB="$TOOLCHAIN_DIR/bin/${TARGET_HOST}-ranlib"
  33. export STRIP="$TOOLCHAIN_DIR/bin/${TARGET_HOST}-strip"
  34. TARGET=android-arm
  35. build
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

来自云龙湖轮廓分明的月亮

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表