• ortp 交叉编译


    记录一下 ortp 在PC上编译及交叉编译情况。


    一、下载

    这里使用的是 release 5.1 版本。
    https://github.com/BelledonneCommunications/ortp
    下载:
    git clone https://github.com/BelledonneCommunications/ortp.git
    切换一下分支:
    git checkout release/5.1

    二、Ubuntu编译

    1、安装依赖包

    由于编译依赖于 bctoolbox 库,所以再此之前要先编译安装bctoolbox。
    参考:bctoolbox 交叉编译

    如果缺少这个依赖包会出现如下错误:

    CMake Error at CMakeLists.txt:78 (find_package):
      By not providing "Findbctoolbox.cmake" in CMAKE_MODULE_PATH this project
      has asked CMake to find a package configuration file provided by
      "bctoolbox", but CMake did not find one.
    
      Could not find a package configuration file provided by "bctoolbox"
      (requested version 0.2.0) with any of the following names:
    
        bctoolboxConfig.cmake
        bctoolbox-config.cmake
    
      Add the installation prefix of "bctoolbox" to CMAKE_PREFIX_PATH or set
      "bctoolbox_DIR" to a directory containing one of the above files.  If
      "bctoolbox" provides a separate development package or SDK, be sure it has
      been installed.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    2、编译及安装

    这里打算将编译出来的库放在上级目录下的target_pc目录。
    在克隆下来的工程根目录创建文件夹build_dir,并且在里面创建编译脚本。
    build.sh:

    #!/bin/sh
    
    #编译工具
    COMPILER_CC=gcc
    COMPILER_CXX=g++
    
    #安装位置
    COMPILER_PREFIX=$(pwd)/../../target_pc
    
    #依赖库位置
    COMPILER_LIB=$(pwd)/../../target_pc
    
    cmake -DCMAKE_INSTALL_PREFIX=$COMPILER_PREFIX \
          -DCMAKE_C_COMPILER=$COMPILER_CC \
          -DCMAKE_CXX_COMPILER=$COMPILER_CXX \
          -DCMAKE_PREFIX_PATH="$COMPILER_LIB" \
          ..
    
    make
    make install
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在脚本里面制定了编译安装的指定目录,所使用的gcc、g++

    执行。

    3、编译结果

    会生成头文件和动态、静态库。
    在这里插入图片描述

    三、交叉编译

    1、安装依赖包

    交叉编译主要的点在于要配置交叉编译工具(gcc)以及指定编译平台的依赖库(sysroot)。
    还有指定已经交叉编译好的 bctoolbox 的库。
    参考:bctoolbox 交叉编译

    2、编译及安装

    这里打算将编译出来的库放在上级目录下的target_cross目录。
    在克隆下来的工程根目录创建文件夹build_dir,并且在里面创建编译脚本。
    build.sh:

    #!/bin/sh
    
    #编译工具路径
    QL_CROSSTOOLS=/opt/ql_crosstools/ql-ag550qcn-le20-gcc820-v1-toolchain/gcc/usr/bin/arm-oe-linux-gnueabi
    
    #SYSROOT路径
    QL_SYSROOT=/home/hrx/work/ql-sysroots
    
    #编译工具
    COMPILER_CC=$QL_CROSSTOOLS/arm-oe-linux-gnueabi-gcc
    COMPILER_CXX=$QL_CROSSTOOLS/arm-oe-linux-gnueabi-g++
    #编译选项
    COMPILER_FLAGS="-march=armv7-a -marm -mfpu=neon -mfloat-abi=hard"
    
    #安装位置
    COMPILER_PREFIX=$(pwd)/../../target_cross
    
    #依赖库位置
    COMPILER_LIB=$(pwd)/../../target_cross
    
    cmake -DCMAKE_SYSTEM_NAME=Linux \
          -DCMAKE_INSTALL_PREFIX=$COMPILER_PREFIX \
          -DCMAKE_C_COMPILER=$COMPILER_CC \
          -DCMAKE_C_FLAGS="$COMPILER_FLAGS" \
          -DCMAKE_CXX_COMPILER=$COMPILER_CXX \
          -DCMAKE_CXX_FLAGS="$COMPILER_FLAGS" \
          -DCMAKE_SYSROOT=$QL_SYSROOT \
          -DCMAKE_PREFIX_PATH="$COMPILER_LIB" \
          ..
    
    make
    make install
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    3、编译结果

    会生成头文件和动态、静态库。
    在这里插入图片描述

    四、问题记录

    由于不同的编译器版本不同,可能会产生不同的问题,这里记录一个。

    1、使用gcc 4.9.3版本进行交叉编译时报错

    报错:

    fecstream.c:241:9: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
    
    • 1

    问题出在 fecstream.c 文件中的for的写法,例如 for (int a; a < 10; a++),不能够正在for里面定义a。
    网上针对这个问题的解决方法基本都是编译选项添加 -std=c99 或者 -std=c11
    但是这会产生另一个报错:

    netsim.c:83:2: error: implicit declaration of function 'strcasecmp' [-Werror=implicit-function-declaration]
    
    • 1

    解决方案:
    fecstream.c 中所有的在for里面定义变量的,把变量移出去到外面进行定义,不要通过添加编译选项**-std=c11** 的方式即可解决。


    广告插入:
    下面是一个领外卖券、打车券的公众号,如果恰有需要可以关注一下。

  • 相关阅读:
    javaEE高阶---Spring MVC
    BUUCTF WEB PICKLE STORE
    JointJS+新的MindMap应用程序
    微信小程序---JavaScript脚本
    Permissions for ‘xxx.pem‘ are too open
    如何使用Java创建数据透视表并导出为PDF
    Go语言开发小技巧&易错点100例(十三)
    Kubernetes(k8s)介绍
    zookeeper的安装部署
    硬件描述语言(HDL)基础——过程块
  • 原文地址:https://blog.csdn.net/lang523493505/article/details/126725502