easyDarwin的交叉编译

  • 前言
  • 一、EasyDarwin简介
  • 二、配置环境介绍
  • 三、交叉编译过程
    • 1.go环境的搭建
    • 2.编译
  • 后记

前言

最近项目有个需求是在嵌入式设备中运行一个RTSP服务器,满足推流到该服务器后,其他终端设备能够从这个RTSP服务器中拉RTSP流出来。找来找去找到了easyDarwin这个开源项目,主要记录一下交叉编译的过程吧。


一、EasyDarwin简介

“高性能开源RTSP流媒体服务器,基于go语言研发,维护和优化:RTSP推模式转发、RTSP拉模式转发、录像、检索、回放、关键帧缓存、秒开画面、RESTful接口、WEB后台管理、分布式负载均衡,基…”
看到基于go语言研发这一段几乎让我差点放弃交叉编译,还好百度了一下发现好像也有用go语言做嵌入式的大佬,所以似乎有搞头。

二、配置环境介绍

1.编译环境:Linux version 3.13.0-24-generic (buildd@panlong) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014
2.交叉编译工具:arm-histbv320-linux

三、交叉编译过程

1.go环境的搭建

go环境的搭建主要参照这里:嵌入式linux之go语言开发(一)环境搭建
简述一下过程,就是用gcc先编译go1.4编译器的源码,然后用编好的go1.4编译器去编译用go写的go1.11的ARM编译器(这里似乎有点绕),然后用ARM版的go编译器去编译easydarwin。具体过程不再展开,博主介绍的挺详细的,按照步骤操作就行。

2.编译

  • EasyDarwin的下载:https://github.com/EasyDarwin/EasyDarwin
    下载的时候注意下载master就行了

  • 正常编译:
    编译的话建议先按照下载页面的二次开发部分编译一遍,注意需要编译环境能上外网,并且使用root权限编译

    # go tools
    go get -u -v github.com/kardianos/govendor
    go get -u -v github.com/penggy/gobuild# npm tools
    npm i -g apidoc
    npm i -g rimraf#这步其实是在下载代码,已经下载过的话直接跳过即可
    cd $GOPATH/src/github.com
    mkdir EasyDarwin && cd EasyDarwin
    git clone https://github.com/EasyDarwin/EasyDarwin.git --depth=1 EasyDarwin
    cd EasyDarwin#编译linux版本
    npm run build:lin
    

    编译完成之后,就会在EasyDarwin目录下生成一个可执行文件easydarwin,直接运行即可,运行结果如下图所示:

  • 交叉编译
    正常编译运行之后,我们大致了解了正常运行起来之后的样子,接下来就开始交叉编译。
    首先确保编译ARM版本时配置的环境变量依然存在,我的环境变量配置如下:

    #go1.4 build env 使用go1.4编译go1.11时需要配置的环境变量
    export GOROOT_BOOTSTRAP=/home/weiwei/opennSources/go
    #go1.11 build env 使用go1.11编译easydarwin需要配置的环境变量,CC_FOR_TARGET和CXX_FOR_TARGET一定要设置为交叉编译工具所在的路径
    export CC_FOR_TARGET=/home/weiwei/hisi/HiSTBLinuxV100R005C00SPC070/tools/linux/toolchains/arm-histbv320-linux/bin/arm-histbv320-linux-gcc
    export CXX_FOR_TARGET=/home/weiwei/hisi/HiSTBLinuxV100R005C00SPC070/tools/linux/toolchains/arm-histbv320-linux/bin/arm-histbv320-linux-g++export GOROOT=/home/weiwei/opennSources/go1.11/go
    export GOBIN=$GOROOT/bin
    export GOPATH=/home/weiwei/opennSources/gopath
    export PATH=$PATH:$GOBIN:GOPATH/bin
    

    上述环境变量配置完毕之后,就可以编译easydarwin了,首先进入easydarwin的目录,找到package.json文件,其中有这一段:

"scripts": {"build:ico": "rsrc -arch amd64 -ico ed.ico -o EasyDarwin_windows.syso","build:www": "cd web_src && npm run build && cd .. && apidoc -i routers -o www/apidoc","build:doc": "apidoc -i routers -o www/apidoc","build:win": "go build -tags release -ldflags \"-s -w\" -o EasyDarwin.exe","build:lin": "go build -tags release -ldflags \"-X 'main.buildDateTime=$(date '+%Y-%m-%d %H:%M:%S')' -X 'main.gitCommitCode=$(git rev-list --full-history --all --abbrev-commit --max-count 1)' -s -w\" -o easydarwin","build:dev": "go build -o EasyDarwin.exe","dev": "go build -o EasyDarwin.exe","dev:lin": "go build -o easydarwin","dev:www": "cd web_src && npm run start","clean": "rimraf EasyDarwin.exe EasyDarwin.exe~ easydarwin"},

我理解这段其实就是编译要执行的脚本,修改其中和linux有关的编译项——修改其中的go build为GOOS=linux GOARCH=arm GOARM=7 go build即可,这样就是用ARM版的go编译器去编译,修改后的脚本如下:

"scripts": {"build:ico": "rsrc -arch amd64 -ico ed.ico -o EasyDarwin_windows.syso","build:www": "cd web_src && npm run build && cd .. && apidoc -i routers -o www/apidoc","build:doc": "apidoc -i routers -o www/apidoc","build:win": "go build -tags release -ldflags \"-s -w\" -o EasyDarwin.exe","build:lin": "GOOS=linux GOARCH=arm GOARM=7 go build -tags release -ldflags \"-X 'main.buildDateTime=$(date '+%Y-%m-%d %H:%M:%S')' -X 'main.gitCommitCode=$(git rev-list --full-history --all --abbrev-commit --max-count 1)' -s -w\" -o easydarwin","build:dev": "go build -o EasyDarwin.exe","dev": "go build -o EasyDarwin.exe","dev:lin": "GOOS=linux GOARCH=arm GOARM=7 go build -o easydarwin","dev:www": "cd web_src && npm run start","clean": "rimraf EasyDarwin.exe EasyDarwin.exe~ easydarwin"},

修改完成后,继续交叉编译:

npm run build:lin

接下来交叉编译的过程中,会报一个溢出错误,百度发现有人遇到过这个问题,解决方案如下:

# 修改routers/record.go 106行
把math.MaxUint32改为math.MaxInt32

修改完毕后再次编译即可。

编译完成之后,把生成的可执行文件放到板子上,直接运行即可;easydarwin有个后台管理的网页服务,如果也想访问嵌入式设备上的这个服务的话把EasyDarwin目录下的www文件夹放到和板子的可执行文件同一个目录上即可。

验证推流拉流的方法在下载页面有介绍,这里就不重复了。

如果编译后发现生成的可执行程序依然在编译环境下能够执行,而非在ARM下执行,需要检查环境变量是否正常配置。

后记

本来没打算写这个总结的,后来想想自己整天在别人的帮助下解决问题,提供一下自己的解决问题的方式回馈大家,才是应该做的事情。

就酱。

哦对了,第一篇技术博客,第一次用markdown写东西,希望以后能熟练一点

EasyDarwin的交叉编译相关推荐

  1. 嵌入式linux下的FFmpeg交叉编译(最全面)

    FFmpeg介绍 当下直播应用很火,在音视频领域,FFmpeg相当知名.可能你用的一些视频播放器背后都有它的身影.FFmpeg是一个开源的跨平台多媒体处理工具,可以用于处理音视频流.转码.封装.解封装 ...

  2. Golang的交叉编译问题

    参考:Golang交叉编译各个平台的二进制文件 - Go语言中文网 - Golang中文社区 (studygolang.com).也谈Go的可移植性 | Tony Bai 今天准备将一个在Mac上开发 ...

  3. Linux 交叉编译简介

    Linux 交叉编译简介 主机,目标,交叉编译器 主机与目标 编译器是将源代码转换为可执行代码的程序.像所有程序一样,编译器运行在特定类型的计算机上,输出的新程序也运行在特定类型的计算机上. 运行编译 ...

  4. TVM交叉编译和远程RPC

    TVM交叉编译和远程RPC 本文介绍了TVM中使用RPC的交叉编译和远程设备执行. 使用交叉编译和RPC,可以在本地计算机上编译程序,然后在远程设备上运行它.当远程设备资源受到限制时(如Raspber ...

  5. 用TensorRT针对AArch64用户的交叉编译示例

    用TensorRT针对AArch64用户的交叉编译示例 以下介绍如何在x86_64linux下为AArch64 QNX和Linux平台交叉编译TensorRT示例. 2.1. Prerequisite ...

  6. Go 学习笔记(37)— 标准命令(go build 跨平台编译、交叉编译、go clean、go run、go fmt、go install、go get)

    1. 标准命令简述 Go 本身包含来大量用于处理 Go 程序的命令和工具. 命令 作用 build 用于编译指定的代码包或 Go 语言源码文件.命令源码文件会被编译成可执行文件,并存放到命令执行的目录 ...

  7. linux wifi-tools,Linux下WiFi工具wireless_tools交叉编译,及其支持生成iwconfig使用的内核配置...

    内核的配置: General setup  ---> Kernel compression mode (LZMA)  --->LZMA [*] Networking support  -- ...

  8. Cmake 交叉编译

    转载自 http://zhixinliu.com/2016/02/01/2016-02-01-cmake-cross-compile/ CMake交叉编译 CMake的使用,以及如何将一个项目移植到A ...

  9. Ubuntu 8.04嵌入式交叉编译环境arm-linux-gcc搭建过程图解

    Linux版本:Ubuntu8.04 内核版本:Linux 2.6.24 交叉编译器版本:arm-linux-gcc-3.4.1 交叉编译器下载链接: https://share.weiyun.com ...

  10. Ubuntu上通过android toolchain交叉编译Valgrind操作步骤

    关于Valgrind的介绍可以参考:https://blog.csdn.net/fengbingchun/article/details/50196189. 这里介绍下在Ubuntu 16.04上通过 ...

最新文章

  1. 4.65FTP服务4.66测试登录FTP
  2. linux中sh基本语法
  3. ITK:使用FFT的归一化相关
  4. 内部导线拉力测试_端子拉脱力的正确测试方法及标准
  5. python自动生成表格_Python自动整理 Excel 表格
  6. [原]那些年整理的Linux常用命令,简单明了
  7. ICCV 2019 中国论文数量超美国,商汤57篇论文入选!
  8. 艾瑞咨询:即时通讯面临多种安全威胁
  9. button按钮onclick触发不了_用一篇深度好文,详解按钮的设计
  10. 支持向量机原理小结(3)——核方法和非线性支持向量机
  11. gcc编译C++ 符号名解码 c++filt demangle
  12. 二进制算法问题解析——1000瓶药水,1瓶有毒药,几只小白鼠能够找出?
  13. 使用TMT工具进行威胁分析及风险评估(TARA)
  14. Unity3d之AR小游戏
  15. 无线充电设计(二)-方案设计
  16. JAVA初学者必备的基础书籍
  17. Python爬虫之scrapy框架-爬取小说信息
  18. BBS论坛详细功能列表
  19. 2022-2028中国干墙砂光机市场现状研究分析与发展前景预测报告
  20. python练习题:输入账号密码

热门文章

  1. 北大核心2020_“三个月不录用视为拒稿”,核心期刊投稿,编辑的这句话别有用意...
  2. 硬件芯片----74HC595芯片的运用原理
  3. 火狐浏览器书签工具栏固定书签宽度
  4. 1032. 字符流(每日一难phase2--days28)
  5. 854. 相似度为 K 的字符串(每日一难phase2--day20)
  6. 使用google service定位服务
  7. 网页游戏开发基础——网页基础知识
  8. 硬笔行书字帖3500常用字_2018年【成年人实用硬笔行书】一对一直播培训简介
  9. csol永恒python属性_狗神弑神参上!CSOL缔造者新添Lua功能脚本
  10. WordPress优化攻略:全面提升WP网站速度仅需3个加速方法和1个插件