求助 github action 自动打包动态链接库

2023-05-23 16:38:13 +08:00
 blankmiss

帮一个开源作者写的,我自己是不懂 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 ➜ /workspaces/requests/libs_dist (main) $ go env -w GOOS=linux
@dnslin ➜ /workspaces/requests/libs_dist (main) $ go env -w GOARCH=arm64
@dnslin ➜ /workspaces/requests/libs_dist (main) $ go build -buildmode=c-shared -o requests-go-arm64.so export.go
go: no Go source files

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

1320 次点击
所在节点    Go 编程语言
9 条回复
gam2046
2023-05-23 16:45:50 +08:00
看起来并不是一个纯 Go 的代码?如果用到了外部的,非 Go 的部分,也就是用到了 CGO 是不能直接这样编译的。需要你准备对应平台的(你的情况下,也就是 arm ) C/C++工具链,然后配置 CC/CXX 变量。
blankmiss
2023-05-23 17:01:42 +08:00
@gam2046 https://github.com/wangluozhe/requests 这个项目 纯 golang 的
yleoer
2023-05-23 17:05:04 +08:00
我在 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 requests-go-arm64.so export.go`
virusdefender
2023-05-23 17:07:05 +08:00
export.go 里面是 cgo 的代码,不支持跨平台编译
flyqie
2023-05-23 17:10:53 +08:00
@yleoer #3

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

除 纯 go 代码编译独立二进制 以外的所有情况似乎都需要 cgo 。
blankmiss
2023-05-23 17:15:11 +08:00
@yleoer 我测试了 还是会提示 go: no Go source files
gam2046
2023-05-23 17:32:58 +08:00
哦豁,是 export 到动态库的呀,那 CGO 是没跑了。

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

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

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

然后把代码挂进去 CGO_ENABLED=1 ... go build 这样编译就行了
sardina
2023-05-23 18:56:06 +08:00
你编译到动态库就必须要 cgo 了
blankmiss
2023-05-23 19:19:08 +08:00
@gam2046 ths

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/942313

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX