c - 使用 go build 静态链接共享库

标签 c go

我需要创建一个静态库以在 docker 容器中运行它。使用 go run main.go 运行我的代码时它运行顺利。然而,当我尝试将我的代码构建为静态程序(将所有动态依赖项重新编译到一个独立的库中,包括共享库)时,事情就变得复杂了。

我的应用程序依赖于位于我的 /usr/local/lib/librandom_c.so 中的 C 共享库,而我的应用程序源代码位于 $GOPATH/src/github.com/<user>/myapp .

当我尝试静态链接共享库构建应用程序时,它可以毫无怨言地工作:

go build -a -o hello .

...但是 docker 提示共享库不存在(从头开始使用)。

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

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

报错:

cannot find -lrandom_c

如何静态链接我的库?

最佳答案

CL 26492表明它可能很简单(Go 1.14 Q1 2020 可能,尚未确认):

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

关于c - 使用 go build 静态链接共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57243667/

相关文章:

c - 使用 MPI 或 openMP 在 c 中进行循环并行化的最佳方法

字符连接

c - 如何修复适用于某些值但不适用于其他值的代码

java - 套接字编程 : Is extra '\n' added in the golang client or the Java server?

Golang在Struct数组中搜索特定项目

unit-testing - 如何在 gin 的测试上下文中设置主机?

c - Arduino:如何打印出定义常量的值?

ruby-on-rails - 在用 Ruby 和 C 编写的应用程序之间共享常量的方法?

string - 如何从 Go 中的字符串中替换第 n 个字符

go - 过度节俭或痛饮问题