交叉编译:curl+openssl+git submodule+github Action

Android交叉编译:curl+openssl+Git Submodule + Github Action

相关知识点

一、创建项目

1. 添加子项目

1. 添加curl: `git submodule add https://github.com/curl/curl.git` 
2. 添加openssl: `git submodule add https://github.com/openssl/openssl.git`

2. 编写执行脚本

简单了解下一些关键字

  • GCC
    gccGNU C语言编译器 GNU C Compiler
  • LLVM
    LLVM (Low Level Virtual Machine,底层虚拟机)
  • LLVM2.0 - Clang
    clangLLVM编译器工具集的前端,输出代码对应的抽象语法。

这里是我编写的脚本 temp_clang.sh

脚本基本通用,大部分都只需进行简单修改,前提是你需要了解一些参数的意义【 MakeFile

# clang 只支持 armeabi-v7a arm64-v8a x86 x86_64
//for arch in armeabi-v7a arm64-v8a 
for arch in armeabi-v7a arm64-v8a 
do
     chmod +x temp_clang.sh
    ./temp_clang.sh $arch 
done

编译过程中如果有问题,可以查看openssl官方文档

设置输出目录(重要):

  • opensslDir是输出目录
  • openssl_lib这是so的输出目录($opensslDir/lib)

为什么要改so的输出目录,因为curl 检测的openssl的都是opensslDir的lib和inlcude,但是openssl-3.0.0默认输出的是lib32或者lib64这种,看camke文档它好像是可以检测,但是这里make不行。 不修改的话会导致curl 无法找openssl。

PATH=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH
./Configure android-x86 --release -latomic --libdir=$openssl_lib no-asm shared no-cast no-idea no-camellia no-comp -D__ANDROID_API__=21 --prefix=$opensslDir  --openssldir=$opensslDir

make

make install

2. 添加github action

.github/workflows 添加android.yml

name: Android CI

on:
  push:
    branches: [ master ]

jobs:
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest
    steps:
      # 克隆代码
      - uses: actions/checkout@v2
      # 获取 子模块
      - name: Checkout submodules
        shell: bash
        run: |
          git submodule init
          git submodule update
       # 添加ndk    
      - name: Setup Android NDK
        uses: nttld/setup-ndk@v1.0.6
        id: setup-ndk
        with:
          ndk-version: r21 
          add-to-path: false
      # 添加工具,为make做准备
      - name: add autoconf automake libtool
        run: brew install autoconf automake libtool    
      - name: ndk bulid    
        working-directory:   
        run: |
          chmod +x start_build.sh
          echo ${{ steps.setup-ndk.outputs.ndk-path }}
          export ANDROID_NDK_ROOT=${{ steps.setup-ndk.outputs.ndk-path }}
          ./start_build.sh
	  ## 收集产物	  
      - name: Upload a Build Artifact  
        uses: actions/upload-artifact@v2
        with:
          name: ndk-openssl-curl-lib
          path: |
            ./android-lib-curl/**/include/
            ./android-lib-curl/**/lib/
            ./android-lib-openssl/**/include/
            ./android-lib-openssl/**/lib/

3. 推送代码到github上触发构建

git基础操作,这里不做描述

4. 总结

  1. 添加子模块(curl+openssl)
  2. 编辑构建脚本
  3. 添加github Action脚本(拉取代码->配置环境->make)
  4. 推送代码触发脚本
  5. 构建产物上传

其他

demo项目

  1. 子模块是可以更新、删除的,可以网上搜相关资料
  2. 收集的产物存放在github 是有有效期的,过期失效,不过你可以重新执行脚本
  3. 功能真香系列:google有提供curl的原始库支持,使用的Android Gradle Plugin 4.0+:prefab功能
    案例:google-demo-prefab-curl-ssl
  4. 可以利用GitHub Action通过这种方式构建其他项目,比如ijkplayer
    流程:通过git拉取ijkplayer的代码->配置便宜环境->执行构建->保存构建产物
<think>嗯,用户让我介绍如何交叉编译ZLMediaKit流媒体服务器并部署到英码边缘盒子上,还要给出具体的代码和步骤。首先,我需要确认用户的需求是什么。他们可能是在做物联网或者边缘计算的项目,需要在资源受限的设备上运行流媒体服务。英码边缘盒子通常基于ARM架构,比如RK3399或者其他嵌入式平台,所以交叉编译是必须的,因为直接在设备上编译可能效率低下或者环境不支持。 接下来,我需要回忆ZLMediaKit的编译过程。ZLMediaKit是一个基于C++的项目,依赖OpenSSL和libsrtp等库。交叉编译的话,需要准备好交叉编译工具链,比如aarch64-linux-gnu。然后,用户需要先克隆仓库,安装依赖,配置CMake工具链文件,设置交叉编译的参数,比如目标架构、编译器路径等。 然后,可能需要处理依赖库的交叉编译。比如,用户可能需要先交叉编译OpenSSL,因为ZLMediaKit依赖它。这时候需要下载OpenSSL源码,配置为交叉编译,然后安装到指定目录,这样在编译ZLMediaKit时才能正确链接。 然后,配置CMake的时候,指定工具链文件,设置安装路径,生成Makefile,最后进行编译和安装。编译完成后,生成的可执行文件和依赖的库需要打包到设备上。可能还需要处理动态库的路径,比如使用LD_LIBRARY_PATH或者修改ld.so.conf。 用户还可能遇到运行时的依赖问题,比如缺少库文件,这时候需要检查交叉编译的库是否都正确部署到了设备上。另外,可能需要进行测试,比如启动zlm服务,检查端口是否监听,推流测试是否正常。 需要注意的是,步骤中可能涉及到的具体路径需要根据实际情况调整,比如工具链的位置、安装目录等。此外,设备的环境可能不同,比如Ubuntu或Debian,可能需要安装相应的运行时库。 用户可能需要详细的命令和解释,所以需要一步步分解,确保每个步骤都清晰,并解释每个命令的作用。比如,克隆代码时使用--recursive来确保子模块也被下载,配置CMake时指定工具链文件,处理依赖库的交叉编译等。 另外,可能还需要考虑设备上的运行环境,比如权限问题,是否需要创建服务文件或者开机启动脚本。还有配置文件调整,比如修改zlm的配置文件中的端口号或者其他参数以适应设备的环境。 最后,测试部分也很重要,用户可能需要知道如何验证服务是否正常运行,比如使用curl检查API,或者用ffmpeg推流测试。 可能还需要提醒用户注意版本兼容性,比如ZLMediaKit的版本和依赖库的版本是否匹配,工具链是否支持目标设备的架构等。如果有常见的错误,比如找不到库文件,如何解决,可能需要给出一些排查建议,比如使用ldd检查依赖,或者设置LD_LIBRARY_PATH。</think>以下是在英码边缘盒子(ARM架构)上交叉编译并部署ZLMediaKit流媒体服务器的完整流程: --- ### 一、环境准备(Ubuntu 20.04 x86_64主机) ```bash # 安装交叉编译工具链 sudo apt-get install g++-aarch64-linux-gnu gcc-aarch64-linux-gnu # 安装依赖工具 sudo apt-get install cmake git pkg-config ``` --- ### 二、交叉编译ZLMediaKit #### 1. 克隆代码与子模块 ```bash git clone --depth 1 https://github.com/ZLMediaKit/ZLMediaKit.git cd ZLMediaKit git submodule update --init --recursive ``` #### 2. 创建工具链文件 新建文件 `arm64_toolchain.cmake`: ```cmake set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR aarch64) set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) ``` #### 3. 交叉编译依赖库 ```bash # 交叉编译openssl wget https://www.openssl.org/source/openssl-3.0.9.tar.gz tar xzf openssl-3.0.9.tar.gz cd openssl-3.0.9 ./Configure linux-aarch64 --cross-compile-prefix=aarch64-linux-gnu- --prefix=/opt/arm64/openssl make -j$(nproc) sudo make install ``` #### 4. 编译ZLMediaKit ```bash mkdir build_arm64 && cd build_arm64 cmake .. -DCMAKE_TOOLCHAIN_FILE=../arm64_toolchain.cmake \ -DCMAKE_INSTALL_PREFIX=/opt/arm64/zlm \ -DENABLE_WEBRTC=ON \ -DOPENSSL_ROOT_DIR=/opt/arm64/openssl make -j$(nproc) && make install ``` --- ### 三、部署到英码边缘盒子 #### 1. 打包文件 ```bash # 在编译主机执行 cd /opt/arm64 tar czf zlm_arm64.tar.gz zlm ``` #### 2. 设备端部署 ```bash # 将压缩包复制到设备并解压 scp zlm_arm64.tar.gz user@edgebox:/tmp ssh user@edgebox # 在设备端执行 sudo tar xzf /tmp/zlm_arm64.tar.gz -C /opt ``` #### 3. 配置环境变量 ```bash # 编辑~/.bashrc export LD_LIBRARY_PATH=/opt/zlm/lib:$LD_LIBRARY_PATH export PATH=/opt/zlm/bin:$PATH # 使配置生效 source ~/.bashrc ``` --- ### 四、运行与验证 #### 1. 启动服务 ```bash cd /opt/zlm/bin ./MediaServer -d & # 后台运行 ``` #### 2. 验证服务状态 ```bash # 检查端口监听 netstat -lnpt | grep 1935 # 测试HTTP API curl http://localhost:80/index/api/getServerConfig ``` --- ### 关键步骤说明 1. **交叉编译工具链**:使用aarch64-linux-gnu工具链适配ARM架构 2. **依赖库处理**:必须交叉编译openssl等基础依赖库 3. **CMAKE_TOOLCHAIN_FILE**:核心编译配置,指定目标架构和编译器 4. **LD_LIBRARY_PATH**:确保设备端能找到动态链接库 5. **配置文件路径**:默认配置文件位于`/opt/zlm/etc/config.ini`,需根据设备环境调整 --- ### 常见问题解决 1. **缺少动态库**:使用`ldd MediaServer`检查依赖,确保所有.so文件存在 2. **端口冲突**:修改`config.ini`中的http/rtmp端口配置 3. **硬件加速**:若设备支持GPU解码,需重新编译FFmpeg并集成 建议根据具体设备型号调整编译参数,可通过`-DCMAKE_BUILD_TYPE=Release`优化性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TieJun~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值