国标GB28181协议云边端视频智能分析平台EasyGBS针对aarch64编译报undefined:syscall.Dup2解决方法

由于很多用户的系统和程序都不同,因此TSINGSEE青犀视频研发团队往往需要根据用户的实际需求来对产品进行定制或者修改。国标EasyGBS视频智能分析平台曾经在aarch64上重新编译过,近期我们又遇到用户有这样的需求,才发现原来有类似需求的用户还是挺多的。

GBS产品架构3平面 定.png

在aarch64环境下编译EasyGBS过程中,出现报错:undefined:syscall.Dup2

29.png

为了排查这一问题,我们在X64上的Centos6.5系统上编译出其他平台的可执行程序,查看下Golang支持的平台,得知支持linux/arm64

30.png

随后我们尝试了采用cgo的交叉编译,使用cgo,就必须指定CGO_ENABLE=1。并且必须指定CC参数为对应架构的gcc的交叉编译器。现在编译64位ARM平台的程序,需要aarch64版本的交叉编译工具。

但是在编译ARM版本的代码时,又出现报错——系统调用找不到的问题。

31.png

对比golang源码实现:go/src/syscall/zsyscall_linux_amd64.go和go/src/syscall/zsyscall_linux_arm64.go,发现arm平台未实现Dup2但是提供了Dup3.如下图所示

32.png

33.png

Dup3与Dup2参数略有差异,dup(int filedes)函数返回一个可用的与filedes共享文件表项的最小描述符。而dup2(int filedes,int filedes2)是使用一个描述符filedes2去指向filedes2文件表项(也是共享),但是在调用dup2之前要确保filedes2为可用描述符。

解决办法是修改调用的地方:

34.png

增加对编译参数的判断,如果 runtime.GOARCH == “arm64”
表示aarch64位编译, 调用Dup3.编译通过。

当然了,TSINGSEE青犀视频研发团队也会将其他视频智能分析平台编译不同的版本,如果大家有需求或者有兴趣,欢迎联系我们了解。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值