Golang Go语言中 求助 github action 自动打包动态链接库

发布于 1周前 作者 h691938207 来自 Go语言

帮一个开源作者写的,我自己是不懂 golang 的

name: Build
on:
  release:
    types: [created] # 表示在创建新的 Release 时触发
permissions:
  contents: write
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Install Go 1.20.4
      uses: actions/setup-go@v2
      with:
        go-version: 1.20.4
    - uses: actions/checkout@v2
    - name: Install dependencies
      run: sudo apt-get update && sudo apt-get install -y build-essential
    - name: Build shared library for amd64
      run: cd libs_dist && chmod +x * && bash build_amd64_so.sh
    - name: Upload artifacts
      uses: actions/upload-artifact@v2
      with:
        name: libs
        path: |
          libs_dist/*.so

理论上不是说 golang 是支持交叉编译的嘛

# build arm64 so
go env -w GOOS=linux
go env -w GOARCH=arm64
go build -buildmode=c-shared -o requests-go-arm64.so export.go

我在 github 免费的 coderspace 里面测试了一下 amd64 是可以正常构建的,但是 arm 的就没办法 执行会提示

[@dnslin](/user/dnslin) ➜ /workspaces/requests/libs_dist (main) $ go env -w GOOS=linux
[@dnslin](/user/dnslin) ➜ /workspaces/requests/libs_dist (main) $ go env -w GOARCH=arm64
[@dnslin](/user/dnslin) ➜ /workspaces/requests/libs_dist (main) $ go build -buildmode=c-shared -o requests-go-arm64.so export.go
go: no Go source files

如果不支持 一个平台构建其他平台的动态链接库 那我就不用测试了


Golang Go语言中 求助 github action 自动打包动态链接库

更多关于Golang Go语言中 求助 github action 自动打包动态链接库的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

10 回复

看起来并不是一个纯 Go 的代码?如果用到了外部的,非 Go 的部分,也就是用到了 CGO 是不能直接这样编译的。需要你准备对应平台的(你的情况下,也就是 arm ) C/C++工具链,然后配置 CC/CXX 变量。

更多关于Golang Go语言中 求助 github action 自动打包动态链接库的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我在 ubuntu 上尝试了下,就算是纯 Go 的代码,编译成动态链接库也需要 CGO ,就像 1 楼说的,我写下我成功编译出 arm 的动态链路库的过程:

apt install -y gcc-aarch64-linux-gnu 下载 arm 的工具链,编译命令:GOOS=linux &amp;&amp; GOARCH=arm64 &amp;&amp; GOARM=7 &amp;&amp; CGO_ENABLED=1 &amp;&amp; CC=arm-linux-gnueabihf-gcc &amp;&amp; CXX=arm-linux-gnueabihf-g++ &amp;&amp; AR=arm-linux-gnueabihf-ar&amp;&amp; go build -buildmode=c-shared -o <a target="_blank" href="http://requests-go-arm64.so" rel="nofollow noopener">requests-go-arm64.so</a> export.go

export.go 里面是 cgo 的代码,不支持跨平台编译

#3

c 调 go 的话本身在 go 编译的时候就需要 cgo 来处理。

除 纯 go 代码编译独立二进制 以外的所有情况似乎都需要 cgo 。

我测试了 还是会提示 go: no Go source files

哦豁,是 export 到动态库的呀,那 CGO 是没跑了。

这是我自己用的交叉编译的 Dockerfile

https://gist.github.com/Lua12138/87b6ebb7c8cbc8e704a0cea4cba855a8

你可以根据自己的情况替换路径,取消注释。

然后把代码挂进去 CGO_ENABLED=1 … go build 这样编译就行了

你编译到动态库就必须要 cgo 了

在Go语言中,使用GitHub Actions自动打包动态链接库(.so文件或.dll文件,取决于目标平台)是一个常见的CI/CD任务。以下是一个简要的步骤指南,帮助你设置GitHub Actions工作流:

  1. 准备环境

    • 确保你的Go项目结构正确,包含必要的源代码和构建脚本。
    • 创建一个.github/workflows目录,用于存放你的GitHub Actions配置文件。
  2. 编写GitHub Actions工作流

    • .github/workflows目录下创建一个新的YAML文件,例如build.yml
    • 配置工作流以使用适当的Go版本,并设置构建目标(如Linux、Windows或macOS)。
  3. 添加构建命令

    • 使用go build命令构建你的动态链接库。对于Linux,可以添加-buildmode=c-shared标志来生成.so文件;对于Windows,使用相应的构建标志生成.dll文件。
    • 确保构建命令在正确的操作系统和架构上执行。
  4. 配置上传或发布

    • 如果需要将生成的动态链接库上传到某个存储库或发布为工件,可以使用GitHub Actions提供的上传功能。
  5. 测试和优化

    • 提交你的更改并触发GitHub Actions工作流。
    • 检查构建日志,确保动态链接库已成功生成并上传(如果需要)。
    • 根据需要进行优化和调整。

通过上述步骤,你应该能够成功地在GitHub Actions中自动打包Go语言的动态链接库。如有需要,可以查阅GitHub Actions和Go语言的官方文档以获取更多详细信息。

回到顶部