EasyDarwin的交叉编译

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,直接运行即可,运行结果如下图所示:
    EasyDarwin的交叉编译_第1张图片

  • 交叉编译
    正常编译运行之后,我们大致了解了正常运行起来之后的样子,接下来就开始交叉编译。
    首先确保编译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写东西,希望以后能熟练一点

你可能感兴趣的:(嵌入式,linux,交叉编译,easydarwin)