在没有GCO的情况下编译go库以在alpine上运行,在libczmq中出错

时间:2017-02-28 05:37:18

标签: c go compilation zeromq alpine

尝试在alpine上运行我的二进制文件时,出现错误:

... binary not found

通常在架构出现问题或我发现glibc时出现问题。我搜索并发现alpine使用muslc替代C库。然后我发现这个Installed Go binary not found in path on Alpine Linux Docker教导了如何在没有CGO的情况下编译,这是允许加载C库的东西:

GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o [name of binary]

当我跑步时,我得到:

go build gopkg.in/zeromq/goczmq.v4: no buildable Go source files in /home/lucas/Go/src/gopkg.in/zeromq/goczmq.v4

我怀疑它是因为libczmq只是Clibzmq的包装器。在这种情况下,如何以可以使用libczmq的方式编译?为什么在阿尔卑斯山必须禁用CGO

究竟是什么CGO?在可用时不应该使用libc,而在muslc时不能使用;with cte as( select [rn] = row_number() over( partition by [Number], [Value] order by [Number], [Value] ), * from [your_table_name] ) select count(*) from cte where [rn] > 1; 吗?我想更多地了解背景中发生的事情。

注意:我在ubuntu中编译外高山,这是一个问题吗?

1 个答案:

答案 0 :(得分:2)

我知道这个问题现在已经有3年了,但是互联网上对此一无所知,我正面临着同样的问题,大约花了两天的时间才终于找到合适的解决方案。

简而言之,我有一个Go项目,该项目使用int *我想编译成一个完整的二进制文件以将其放入int ** Docker容器中(尽管在这种情况下,一个高山容器可以工作一样)。在Internet上,人们现在倾向于告诉您设置goczmq,并且一切都会正常进行,这是事实。这告诉Go不要使用CGO,它允许您在Go代码中使用C库,但是在运行代码时需要这些C库在系统上可用。如您所知,alpine没有这些C库(或者,在FROM scratch中有不同的C库,而不是CGO_ENABLED=0)。

但是,对于我们而言,这没有帮助。我们希望Go代码能够使用现有的C库,因为我们使用了muslc,正如您所确定的,glibcgoczmq的Go包装器,而它本身是{{1}的C包装器}(用C ++编写,这使我们的生活更加艰难)。

我通过使用静态二进制文件解决了这个问题。我没有动态链接到目标系统(在本例中为czmq,在目标系统上可用的任何C库),而是编译了我的代码以及所有库(libzmqmuslc和{{ 1}})合并为一个统一的二进制文件。

我在这里基于高山使用Docker multi-stage builds,但从理论上讲,您也可以直接在计算机上执行此操作。

muslc

现在这几乎可行!剩下的唯一事情就是将此语句添加到czmq文件的开头,否则CGO会对您的操作感到困惑:

libzmq

这很重要,即使您没有在程序中直接使用CGO。