Golang如何构建包含所有依赖的共享库(.so)文件?
Golang如何构建包含所有依赖的共享库(.so)文件? 我有一个"法律"要求,需要构建一个Go模块来生成可执行文件及其所有依赖项,打包成单个.so文件。该可执行文件包含我们的私有Go代码,并动态链接到作为单个.so文件的开源包。
这可行吗?如何实现?
我使用的是Go 1.12.7版本,在SLES12系统上设置了GO111MODULE=on。
非常感谢任何建议。
-D
我想再次向这个群组确认一下,是否有办法构建自己的Go源码并动态链接到由c-shared生成的第三方包?
更多关于Golang如何构建包含所有依赖的共享库(.so)文件?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你好 Dantran,
这难道不是你在找的内容吗?http://snowsyn.net/2016/09/11/creating-shared-libraries-in-go/ 祝你今天愉快。
我也看到了那个帖子,但不太理解其中的内容 😞 也许你可以展示一种方法,在 GOPATH/pkg/mod 下针对已下载的依赖项创建共享库(.so)?
注意,我使用 GOMOD 构建我的应用程序。
太棒了,我能在我的模块目录(包含 go.mod 的那个)中成功构建我的 .so 文件了。
go build -o libthirdparty.so -buildmode=c-shared
它创建了一个大约 60M 的 .so 文件。
现在我需要生成我期望体积很小的可执行文件。
非常感谢任何帮助。
好的,我不知道gomod可能出了什么问题,但首先我会按照这篇文章来检查会发生什么。所以我将遵循给出的指示:
如你所见,代码必须是
main包的一部分,并包含一个空的main函数。必须导入C包。导出的函数必须带有export注解
然后使用以下命令构建:
go build -o libimgutil.so -buildmode=c-shared yourfile.go
你能试试这个吗?
在Go中构建包含所有依赖的共享库(.so)文件是可行的,但需要利用Go的C共享库构建功能。以下是实现步骤和示例代码。
首先,确保你的Go代码支持C共享库导出。你需要使用//export注释标记要导出的函数,并导入C包。以下是一个示例:
-
创建Go模块: 假设你的模块名为
example.com/mylib,目录结构如下:mylib/ ├── go.mod └── main.go -
编写Go代码(
main.go): 在代码中,定义一个或多个导出函数。注意:必须导入C包,并且有一个空的main函数。package main import "C" //export MyFunction func MyFunction() { // 你的私有Go代码逻辑 println("Hello from Go shared library!") } func main() { // 必须有一个空的main函数 } -
构建共享库: 使用Go工具链构建共享库。在终端中运行以下命令:
go build -buildmode=c-shared -o mylib.so这将生成
mylib.so文件(在Linux上)和对应的头文件mylib.h。该.so文件包含你的所有Go代码及其依赖项,动态链接到系统库。 -
验证依赖项: 使用
ldd命令检查生成的.so文件,确认它动态链接到系统库(如libc等),但不包含外部Go依赖的静态链接(因为依赖已打包进.so):ldd mylib.so
注意事项:
- 此方法要求你的Go代码通过C风格函数导出,适用于动态加载场景(如被C/C++程序调用)。
- 生成的
.so文件是独立的,包含所有Go依赖,但可能依赖系统库(如glibc)。确保目标系统有兼容的库。 - 如果你需要生成可执行文件而非共享库,可以使用
-buildmode=exe,但根据你的描述,共享库更符合需求。
示例代码已展示如何导出函数。构建后,你可以在C程序中通过dlopen和dlsym动态加载并使用MyFunction。
如果遇到版本问题,Go 1.12.7支持此功能,但建议升级到更新的Go版本以获得更好的兼容性。

