把go编译成可执行文件放在LinkIt Smart 7688的openwrt19系统中运行 (附Illegal instruction解决方法)

 我在Google找了很多方法,历尽千辛万苦,终于找到可用的一个方法。

我会先介绍我操作成功的方法,之后会介绍失败的方法。


---------------------------------------------

成功的方法:

(参考https://blog.lutty.me/code/2017-04/golang-cross-compile-openwrt-ddwrt-build.htmlhttps://studygolang.com/articles/7326https://github.com/xtaci/kcptun/issues/79 ,https://blog.csdn.net/a791693310/article/details/85178676


首先,我用的硬件的属性是:

export GOOS=linux

export GOARCH=mips32le

(如何查看你的平台是mips还是mipsle可以参考https://blog.lutty.me/code/2017-04/golang-cross-compile-openwrt-ddwrt-build.html


然后,我是借助go-mips32工具(https://github.com/gomini/go-mips32)。把这个工具下载到ubuntu系统里,然后在src里面./make.bash 。 然后在我的go代码里编译。

由于我的go代码还引用的github上面的库,所以编译前需要先把库下载下来,还要设置GOPATH参数,如图所示。注意,这里的go编译器是用的go-mips32里面的go。



然后,把生成的可执行文件通过scp或者sftp复制到7688里面,就可以运行啦。



-----------------------

这里我说两个我没有尝试成功的方法。

最开始我的可执行文件编译好之后,运行后会提示【Illegal instruction

一个是根据https://blog.lutty.me/code/2017-04/golang-cross-compile-openwrt-ddwrt-build.html所说的,make kernel_menuconfig然后”其中的 Kernel Type 勾选上 MIPS FPU Emulator“,但是我尝试之后,仍然Illegal instruction报错。

---------------------------


还有一个是参考 https://github.com/appleboy/linkit-smart-7688-golang,忽略掉前面的下载openwrt源的过程,直接在openwrt19里面改就行,然后用”mipsel-openwrt-linux-gccgo“编译就好。这样编译单一文件helloworld是成功的,但是由于我要编译的是一整个项目,一大堆文件还有外部GitHub的引用,所以此方法不行。这篇文章https://www.sajalkayan.com/post/golang-openwrt-mips.html也提到了,没法编译有外部引用的项目。


------------------------------


还有我用go自带的交叉编译功能(https://blog.csdn.net/zhaobisheng1/article/details/81265310),结果也是报错Illegal instruction。


https://blog.csdn.net/a791693310/article/details/85178676 有提到Illegal instruction的解决办法,”设置环境变量时,增加一句GOMIPS=hardfloat“(https://blog.csdn.net/qq531456898/article/details/80095707)这个我试过了,不行,”开启openwrt内核中的FPU“这个上文已经提到了,也没用。


----------------------------------------------------------------------


更新:

我朋友用go自带的交叉编译功能在ios系统编译和运行成功:

env GOOS=linux GOARCH=mipsle GOMIPS=softfloat go build -o  xxx

编译后的文件成功运行。注意这里,要设置GOMIPS参数。之前好像没有设置,所以一直没成功。 。

如果在Ubuntu系统,则是用 export GOOS=linux GOARCH=mipsle GOMIPS=softfloat  。我在Ubuntu系统和win10的Ubuntu虚拟系统都编译运行成功。

go-mips32好像版本比较老,很多go新版本的函数库都用不了。。。。。







Comments