把go编译成可执行文件放在LinkIt Smart 7688的openwrt19系统中运行 (附Illegal instruction解决方法)
我在Google找了很多方法,历尽千辛万苦,终于找到可用的一个方法。
我会先介绍我操作成功的方法,之后会介绍失败的方法。
---------------------------------------------
成功的方法:
(参考https://blog.lutty.me/code/2017-04/golang-cross-compile-openwrt-ddwrt-build.html , https://studygolang.com/articles/7326, https://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
Post a Comment