海思webrtc交叉编译

一、准备

1、在ubuntu14.04 64bit

  因为arm-hisiv400-linux是32位的,故需要在该系统安装兼容32位程序运行的库,参考博客
在这里插入图片描述

2、webrtc源码

   (2019年9月之前的版本,这之后的版本默认是C++14的(由git log可获取该信息),用海思编译器编译会有问题,release版本的分支号branch-heads/m77,这个版本之前的应该都可以。本文使用m77分支)

分支切换命令WebRTC development

git checkout -b hisi_brach refs/remotes/branch-heads/m77
gclient sync   //记得翻墙

3、海思平台3516A100 交叉工具链 arm-hisiv400-linux

二、编译

1、在webrtc源码src目录运行以下脚本(可以不用)

#32位arm 
./build/linux/sysroot_scripts/install-sysroot.py --arch=arm

【上述不行时可以这样参考这个 网站 下载debain文件系统

sudo apt-get install qemu-user-static debootstrap

cd build/linux/

sudo debootstrap --arch armhf --foreign --include=g++,libasound2-dev,libpulse-dev,libudev-dev,libexpat1-dev,libnss3-dev, trusty rootfs  //没有debian_sid_arm-sysroot目录是直接用该名字不用rootfs

mv rootfs debian_sid_arm-sysroot

备份与链接

cd  build/linux/debian_sid_arm-sysroot
mv lib lib_bak
mv usr usr_bak

sudo ln -s /opt/hisi-linux/x86-arm/arm-hisiv400-linux/target/lib lib
sudo ln -s /opt/hisi-linux/x86-arm/arm-hisiv400-linux/target/usr usr

代码变更,否则报错

sed -i -e "s|const auto iter = FindSourceInList(audio_source, &audio_source_list_);|const auto iter = std::find_if(audio_source_list_.begin(), audio_source_list_.end(), [audio_source](const std::unique_ptr<Audio-MixerImpl::SourceStatus> \&p){ return p->audio_source == audio_source; });|" modules/audio_mixer/audio_mixer_impl.cc

3、海思3516A编译

修改src/BUILD.gn文件,在里面添加红框部分,我使用编译自己程序时如果不加这个会在链接时报"未定义的webrtc::CreatePeerConnectionFactory "在这里插入图片描述

#32位arm
 gn gen out/linux_Hi3516Arm --args='target_os="linux" target_cpu="arm" arm_arch="armv7-a" arm_tune="cortex-a7" arm_version=7 arm_optionally_use_neon=true arm_fpu="neon-vfpv4" is_clang=false is_debug=false is_nacl_glibc=true libyuv_use_neon=true rtc_build_with_neon=true rtc_include_internal_audio_device=false rtc_include_pulse_audio=false rtc_libvpx_build_vp9=false rtc_use_gtk=false strip_debug_info=true treat_warnings_as_errors=false use_aura=false use_dbus=false use_gold=true use_goma=false use_lld=false use_ozone=false use_udev=false rtc_build_examples=false rtc_build_tools=false rtc_include_tests=false use_glib=false rtc_use_x11 = false arm_float_abi="softfp" rtc_use_pipewire=false  use_custom_libcxx=false rtc_use_h264=true proprietary_codecs=true rtc_enable_protobuf=false use_rtti=true rtc_build_json=true  ffmpeg_branding="Chrome"  use_openh264=true use_custom_libcxx_for_host=false'

或者

gn gen out/linux_Hi3516Arm --args='target_os="linux" target_cpu="arm" arm_arch="armv7-a" arm_tune="cortex-a7" arm_version=7 arm_optionally_use_neon=true arm_fpu="neon-vfpv4" is_clang=false is_debug=false is_nacl_glibc=false arm_float_abi="softfp" libyuv_use_neon=true rtc_build_with_neon=true rtc_include_internal_audio_device=false rtc_include_pulse_audio=false rtc_libvpx_build_vp9=false rtc_use_gtk=false strip_debug_info=true treat_warnings_as_errors=false use_aura=false use_dbus=false use_gold=true use_goma=false use_lld=false use_ozone=true use_udev=false rtc_build_examples=false rtc_build_tools=false rtc_include_tests=false rtc_use_x11 = false use_custom_libcxx=false rtc_use_h264=true proprietary_codecs=true rtc_use_pipewire=false rtc_enable_protobuf=false use_rtti=true rtc_build_json=true  ffmpeg_branding="Chrome"  use_openh264=true use_custom_libcxx_for_host=false'

若不加use_rtti=true,会在编译自己程序连接静态库时报下面这个错: 解决来源

undefined reference to `typeinfo for rtc::MessageHandler'

在这里插入图片描述

  然后将toolchain.ninja文件中的 arm-linux-gnueabihf 替换为 arm-hisiv400-linux

  使用命令查看配置的参数及参数的含义

gn args --list out/linux_Hi3516Arm

然后运行

ninja -C out/linux_Hi3516Arm

期间出现了错误:
A、

error: 'isfinite' was not declared in this scope
解决: 将对应文件的isfinite改为std::isfinite

B、pfft报错
  解决: 关闭pfft的多核否则报错,参考 来源
在这里插入图片描述

4、头文件提取(粗糙的提取)

#!/bin/bash

#src_path=`find src/ -name "*.h*" | grep -E "src/base|src/third_party|src/media|src/api|src/common_audio|src/modules|src/pc|src/rtc_base|src/system_wrappers" | grep -v ".html" | grep -v "android_ndk"`
src_path=`find src/ -name "*.h*" | grep -v "html*" | grep -v "src/build/*" | grep -v "android_ndk*" | grep -v "blink*" | grep -v "txt*"`
#echo $src_path
for obj in $src_path
do
        echo "cp header file $obj"
        cp --parents $obj inc/ -f
done

5、使用静态库编译选项

-DWEBRTC_LINUX=1 -DWEBRTC_POSIX=1 

三、参考

《1》、海思dv300cv500交叉编译webrtc
《2》、WebRTC 编译支持arm架构

### 海思平台 OpenSSL 交叉编译方法 对于海思平台上的 OpenSSL 交叉编译,具体过程涉及下载源码、配置环境变量以及执行特定命令来完成编译工作。 #### 准备阶段 在 Ubuntu 16.04 x86_64 平台上针对 himix200 进行 OpenSSL 的交叉编译前,需先获取 OpenSSL 源代码文件。通过 `wget` 命令可以从官方网站下载所需版本的压缩包并解压至本地目录[^2]: ```bash wget https://www.openssl.org/source/openssl-1.1.1d.tar.gz tar xvf openssl-1.1.1d.tar.gz cd openssl-1.1.1d/ ``` #### 配置与编译 进入解压后的 OpenSSL 文件夹后,运行 Configure 脚本来指定目标架构和其他选项。这里选择了适用于 ARM 架构的通用设置,并指定了安装路径和交叉编译器前缀: ```bash ./Configure linux-generic32 \ no-shared \ no-asm \ --prefix=/ilock/dist/himix200_openssl_111d \ --cross-compile-prefix=arm-himix200-linux- ``` 上述命令中的参数解释如下: - `linux-generic32`: 表明这是为 Linux 系统下的 32位ARM 设备准备的构建; - `no-shared`: 不创建共享库,只生成静态链接库; - `no-asm`: 关闭汇编优化以简化跨平台兼容性问题; - `--prefix`: 设置最终产物放置的位置; - `--cross-compile-prefix`: 定义用于交叉编译工具链的名字空间。 接着可以继续使用标准流程来进行实际编译操作: ```bash make depend && make make install ``` 这会按照之前设定好的规则,在指定的目标位置下生产所需的 SSL 库文件及其头文件。 #### 使用已编译的库 当完成了以上步骤之后,则可以在应用程序开发过程中引入这些自定义编译出来的 OpenSSL 库。例如编写 C++ demo 时可以通过下面的方式连接到刚才建立起来的安全通信组件[^4]: ```cpp // test.cpp 示例程序 #include <iostream> #include <openssl/ssl.h> int main(){ std::cout << "OpenSSL Version:" << SSLeay_version(SSLEAY_VERSION) << std::endl; } ``` 编译此简单测试案例需要用到先前提到过的 `-I`, `-L` 和 `-l` 参数指向正确的包含路径、库路径及依赖项名称: ```bash arm-gcc6.3-linux-uclibceabi-g++ -o test test.cpp -I/ilock/dist/himix200_openssl_111d/include -L/ilock/dist/himix200_openssl_111d/lib -lssl -lcrypto -static ``` 这样就实现了基于海思硬件平台定制化需求而制作专门版本 OpenSSL 功能的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值