请问ekuiper交叉编译怎么编译?

请问官方开发团队,ekuiper交叉编译怎么编译?makefile里面没有看到相关的target?有没有非官方的大神有这方面的经验的,如果有的话麻烦帮帮忙,不胜感激!!!

交叉编译跟普通的 go 程序一样的方法,通过环境变量 GOOS 和 GOARCH来控制。可以自己修改make file, 在 kuiperd编译部分增加这两个环境变量。

GO111MODULE=on CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -trimpath -ldflags="-s -w -X main.Version=$(VERSION) -X main.LoadFileType=relative" -o kuiperd cmd/kuiperd/main.go

里面的amd64不对吧,如果改成arm64的话,也编译不过。

使用 docker buildx 模拟了 arm 的环境来构建的,可以参考 ekuiper 的 GitHub action:https://github.com/lf-edge/ekuiper/blob/2f9bba1d4c278698a06aa627756dd0eb14273e6e/.github/workflows/build_packages.yaml#L41

我们的版本release里有预编译的ARM架构的二进制包(https://github.com/lf-edge/ekuiper/releases/tag/1.4.0),可以直接使用。需要自己编译可以参考上面 Rory 的建议。如果要从源码编译,amd64和arm64都是可选的支持的GOARCH(Installing Go from source - The Go Programming Language CC 参数指定目标系统的gcc编译器。详情可以参考 Golang交叉编译各个平台的二进制文件 - Go语言中文网 - Golang中文社区

非常感谢

非常感谢,请问预编译的ARM架构的二进制包是不包含mqtt服务器的吧,需要单独下载EMQ X的预编译的ARM架构的二进制包,对吗?

是的。这是两个不同的产品,需要分别下载部署。

在板子上部署的时候,emqx运行正常,但是kuiperd和kuiper运行提示段错误,这是什么原因啊?
运行错误kuiperd
emqx

你的系统 uname -a 的结果是什么呢?另外,你下载的是eKuiper哪个包? 谢谢

系统 uname -a 的结果是Linux ti-j72xx 5.10.37-yocto-standard #1 SMP PREEMPT Thu Dec 2 04:45:30 UTC 2021 aarch64 GNU/Linux。
我下载的是kuiper-1.4.0-linux-arm64.zip这个包。

我们把makefile中的两处改成

# GO111MODULE=on CGO_ENABLED=1 go build -ldflags="-s -w -X main.Version=$(VERSION) -X main.LoadFileType=relative" -o kuiper cmd/kuiper/main.go
# GO111MODULE=on CGO_ENABLED=1 go build -trimpath -ldflags="-s -w -X main.Version=$(VERSION) -X main.LoadFileType=relative" -o kuiperd cmd/kuiperd/main.go
 GO111MODULE=on CGO_ENABLED=0 go build -ldflags="-s -w -X main.Version=$(VERSION) -X main.LoadFileType=relative" -o kuiper cmd/kuiper/main.go
 GO111MODULE=on CGO_ENABLED=0 go build -trimpath -ldflags="-s -w -X main.Version=$(VERSION) -X main.LoadFileType=relative" -o kuiperd cmd/kuiperd/main.go

可以编译过了,在板子上运行也不会出现段错误,但是运行的时候出了一个新的错误,程序还是没有运行起来。

因为我们默认依赖sqlite,CGO_ENABLED是必须的。你可以直接在板上编译的话,不用改makefile直接 make 应该可以

我们板子上没有编译环境,make和gcc指令都不支持。

预编译的ARM64 二进制文件有问题,我们修复一下。你可以按照这个文章https://studygolang.com/articles/14376,先自己编译一下试试。

请问更新版本的预编译二进制文件什么时候能够上传到github?我们目前自己在单板上搭了环境在编译,受限于网络条件(好像编译的时候需要VPN),暂时还没有成功。按照您提供的链接,我不确定能不能在PC上编译成功。

按照您提供的链接中的说明,makefile 修改为

GO111MODULE=on CGO_ENABLED=1 GOOS=linux GOARCH=arm64 CC=aarch64-none-linux-gnu-gcc go build -ldflags="-s -w -X main.Version=$(VERSION) -X main.LoadFileType=relative" -o kuiper cmd/kuiper/main.go
	GO111MODULE=on CGO_ENABLED=1 GOOS=linux GOARCH=arm64 CC=aarch64-none-linux-gnu-gcc go build -trimpath -ldflags="-s -w -X main.Version=$(VERSION) -X main.LoadFileType=relative" -o kuiperd cmd/kuiperd/main.go

GO111MODULE=on CGO_ENABLED=1 GOOS=linux GOARCH=arm64 CC=aarch64-none-linux-gnu-gcc go build -ldflags="-s -w -X main.Version=$(VERSION) -X main.LoadFileType=relative" -tags edgex -o kuiper cmd/kuiper/main.go
	GO111MODULE=on CGO_ENABLED=1 GOOS=linux GOARCH=arm64 CC=aarch64-none-linux-gnu-gcc go build -trimpath -ldflags="-s -w -X main.Version=$(VERSION) -X main.LoadFileType=relative" -tags edgex -o kuiperd cmd/kuiperd/main.go

可以编译通过,并且在嵌入式单板上运行正常。
建议修改github中的makefile及编译说明。

:+1: 谢谢您的建议