Golang如何构建包含所有依赖的共享库(.so)文件?

Golang如何构建包含所有依赖的共享库(.so)文件? 我有一个"法律"要求,需要构建一个Go模块来生成可执行文件及其所有依赖项,打包成单个.so文件。该可执行文件包含我们的私有Go代码,并动态链接到作为单个.so文件的开源包。

这可行吗?如何实现?

我使用的是Go 1.12.7版本,在SLES12系统上设置了GO111MODULE=on。

非常感谢任何建议。

-D

6 回复

我想再次向这个群组确认一下,是否有办法构建自己的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包。以下是一个示例:

  1. 创建Go模块: 假设你的模块名为example.com/mylib,目录结构如下:

    mylib/
    ├── go.mod
    └── main.go
    
  2. 编写Go代码main.go): 在代码中,定义一个或多个导出函数。注意:必须导入C包,并且有一个空的main函数。

    package main
    
    import "C"
    
    //export MyFunction
    func MyFunction() {
        // 你的私有Go代码逻辑
        println("Hello from Go shared library!")
    }
    
    func main() {
        // 必须有一个空的main函数
    }
    
  3. 构建共享库: 使用Go工具链构建共享库。在终端中运行以下命令:

    go build -buildmode=c-shared -o mylib.so
    

    这将生成mylib.so文件(在Linux上)和对应的头文件mylib.h。该.so文件包含你的所有Go代码及其依赖项,动态链接到系统库。

  4. 验证依赖项: 使用ldd命令检查生成的.so文件,确认它动态链接到系统库(如libc等),但不包含外部Go依赖的静态链接(因为依赖已打包进.so):

    ldd mylib.so
    

注意事项

  • 此方法要求你的Go代码通过C风格函数导出,适用于动态加载场景(如被C/C++程序调用)。
  • 生成的.so文件是独立的,包含所有Go依赖,但可能依赖系统库(如glibc)。确保目标系统有兼容的库。
  • 如果你需要生成可执行文件而非共享库,可以使用-buildmode=exe,但根据你的描述,共享库更符合需求。

示例代码已展示如何导出函数。构建后,你可以在C程序中通过dlopendlsym动态加载并使用MyFunction

如果遇到版本问题,Go 1.12.7支持此功能,但建议升级到更新的Go版本以获得更好的兼容性。

回到顶部