由于Go语言非常易学,且代码精简,我们很多同事在研发视频平台的时候,都喜欢拿Go语言来做编程。我们之前也讲过关于GO语言编译的相关问题,比如:Go语言编程ioutil.ReadAll的用法注意点、go语言搭建重定向和反向代理的区别及使用等。
本文我们还讲一下Go 语言开发出现的其他问题,我们的编译人员使用Go语言编译EasyDSS时,出现“collect2.exe: error: ld returned 1 exit status”报错。
在开发过程中,升级 Go 版本后,编译代码出现一堆mingw64 错误,最后一句话为“collect2.exe: error: ld returned 1 exit status”。
原因分析
查看引起错误的代码为获取软件编译时间的代码导致的问题,这一段代码使用了Cgo获取软件编译时间。
代码语言:javascript复制/*
const char* build_time(void)
{
static const char* psz_build_time = `ls_date` " " `ls_time` ;
return psz_build_time;
}
*/
import "C"
此段代码并无错误,经过上一次可编译版本,也未进行修改,初步推断为升级 Go 版本导致,怀疑Go版本与Cgo调用的gcc编译器不匹配导致。
查看 Go 环境为:
gcc 版本为:
两者对比,Go版本为32位版本,gcc为64位版本,32位版本的程序调用64位的编译器,导致出现此种问题。
解决办法:
在此我们为大家提出两种解决办法:
第一种是将下载32位版本的gcc编译器,可以使用。 第二种解决办法为使用64位版本的编译器,可以正常使用。
我采用是第二种解决办法,下载64位版本的Go语言开发环境go1.14.3.windows-amd64,其中amd64代表为64位程序,下载完毕后直接将对应的bin文件设置为环境变量即可。如果使用GoLand进行开发,可以直接如下配置:
- File—Setting—Go—GOROOT;
- 将 go1.14.3.windows-amd64 的路径添加到 GOROOT 中;
- 选中刚刚添加的环境,重新编译程序即可通过。