使用go build静态链接共享库

时间:2019-07-28 18:06:57

标签: c go

我需要创建一个静态库才能在docker容器中运行它。 使用go run main.go运行我的代码时,它运行得很顺利。 但是,当我尝试以STATIC程序的形式构建代码时,事情变得复杂了(将所有动态依赖项重新编译为独立的lib,包括共享库)。 我的应用程序依赖于/usr/local/lib/librandom_c.so中的C共享库,而我的应用程序源代码位于$GOPATH/src/github.com/<user>/myapp中。

在构建应用程序而没有尝试静态链接共享库时,它可以正常运行而不会抱怨:

go build -a -o hello .

...但是随后docker抱怨共享库不存在(使用FROM从头开始)。

到目前为止,我已经尝试了多种组合来静态构建我的应用程序:

go build -a -ldflags '-linkmode "external" -extldflags "-static"' -o hello .

出现错误:

cannot find -lrandom_c

如何静态链接我的库?

1 个答案:

答案 0 :(得分:1)

CL 26492表明它可能和这样做一样简单(可能在2020年第一季度Go 1.14,尚未确认):

go build -static

这将封装以下魔法咒语:

  • windows:-tags netgo -ldflags '-H=windowsgui -extldflags "-static"'
  • linux / bsd:-tags netgo -ldflags '-extldflags "-static"'
  • macos:-ldflags '-s -extldflags "-sectcreate __TEXT __info_plist Info.plist"'
  • android:-ldflags -s