Golang Go语言中 求助 github action 自动打包动态链接库
帮一个开源作者写的,我自己是不懂 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
看起来并不是一个纯 Go 的代码?如果用到了外部的,非 Go 的部分,也就是用到了 CGO 是不能直接这样编译的。需要你准备对应平台的(你的情况下,也就是 arm ) C/C++工具链,然后配置 CC/CXX 变量。
更多关于Golang Go语言中 求助 github action 自动打包动态链接库的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
https://github.com/wangluozhe/requests 这个项目 纯 golang 的
我在 ubuntu 上尝试了下,就算是纯 Go 的代码,编译成动态链接库也需要 CGO ,就像 1 楼说的,我写下我成功编译出 arm 的动态链路库的过程:
先 apt install -y gcc-aarch64-linux-gnu
下载 arm 的工具链,编译命令:GOOS=linux && GOARCH=arm64 && GOARM=7 && CGO_ENABLED=1 && CC=arm-linux-gnueabihf-gcc && CXX=arm-linux-gnueabihf-g++ && AR=arm-linux-gnueabihf-ar&& 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 了
ths
在Go语言中,使用GitHub Actions自动打包动态链接库(.so文件或.dll文件,取决于目标平台)是一个常见的CI/CD任务。以下是一个简要的步骤指南,帮助你设置GitHub Actions工作流:
-
准备环境:
- 确保你的Go项目结构正确,包含必要的源代码和构建脚本。
- 创建一个
.github/workflows
目录,用于存放你的GitHub Actions配置文件。
-
编写GitHub Actions工作流:
- 在
.github/workflows
目录下创建一个新的YAML文件,例如build.yml
。 - 配置工作流以使用适当的Go版本,并设置构建目标(如Linux、Windows或macOS)。
- 在
-
添加构建命令:
- 使用
go build
命令构建你的动态链接库。对于Linux,可以添加-buildmode=c-shared
标志来生成.so
文件;对于Windows,使用相应的构建标志生成.dll
文件。 - 确保构建命令在正确的操作系统和架构上执行。
- 使用
-
配置上传或发布:
- 如果需要将生成的动态链接库上传到某个存储库或发布为工件,可以使用GitHub Actions提供的上传功能。
-
测试和优化:
- 提交你的更改并触发GitHub Actions工作流。
- 检查构建日志,确保动态链接库已成功生成并上传(如果需要)。
- 根据需要进行优化和调整。
通过上述步骤,你应该能够成功地在GitHub Actions中自动打包Go语言的动态链接库。如有需要,可以查阅GitHub Actions和Go语言的官方文档以获取更多详细信息。