最近项目有个需求是在嵌入式设备中运行一个RTSP服务器,满足推流到该服务器后,其他终端设备能够从这个RTSP服务器中拉RTSP流出来。找来找去找到了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
go环境的搭建主要参照这里:嵌入式linux之go语言开发(一)环境搭建
简述一下过程,就是用gcc先编译go1.4编译器的源码,然后用编好的go1.4编译器去编译用go写的go1.11的ARM编译器(这里似乎有点绕),然后用ARM版的go编译器去编译easydarwin。具体过程不再展开,博主介绍的挺详细的,按照步骤操作就行。
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写东西,希望以后能熟练一点