尝试在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
只是C
写libzmq
的包装器。在这种情况下,如何以可以使用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中编译外高山,这是一个问题吗?
答案 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
,正如您所确定的,glibc
是goczmq
的Go包装器,而它本身是{{1}的C包装器}(用C ++编写,这使我们的生活更加艰难)。
我通过使用静态二进制文件解决了这个问题。我没有动态链接到目标系统(在本例中为czmq
,在目标系统上可用的任何C库),而是编译了我的代码以及所有库(libzmq
,muslc
和{{ 1}})合并为一个统一的二进制文件。
我在这里基于高山使用Docker multi-stage builds,但从理论上讲,您也可以直接在计算机上执行此操作。
muslc
现在这几乎可行!剩下的唯一事情就是将此语句添加到czmq
文件的开头,否则CGO会对您的操作感到困惑:
libzmq
这很重要,即使您没有在程序中直接使用CGO。