Golang中CGo、Zig、netgo和libresolv的使用探讨
Golang中CGo、Zig、netgo和libresolv的使用探讨
我正在尝试为MacOS构建一个应用程序(GitHub - JonathanHope/armaria: Armaria是一个快速、开放、本地优先的书签管理器)。这个应用程序使用了CGo,特别是mattn/sqlite。我将编译的CGo部分委托给Zig,这在Linux/Windows的交叉编译方面表现非常出色。然而,我不确定是否可以从Linux(合法地)交叉编译MacOS版本。
当我尝试为MacOS编译(zig cc -target x86_64-macos-none -g0)时,我遇到了以下问题:
/nix/store/dwmb0qcai52d0zkgpm6f5ifx2a8yvsdg-go-1.21.3/share/go/src/net/cgo_unix_cgo_darwin.go:10:10: fatal error: 'resolv.h' file not found
10 | #include <resolv.h>
| ^~~~~~~~~~
1 error generated.
这是因为Zig没有为MacOS目标平台包含libresolv。经过一番摸索,我决定直接使用Go的网络栈(netgo)。然而,这样做却给了我一个不同的错误:
/nix/store/dwmb0qcai52d0zkgpm6f5ifx2a8yvsdg-go-1.21.3/share/go/pkg/tool/linux_amd64/link: running zig failed: exit status 1
error: unable to find Dynamic system library 'resolv' using strategy 'paths_first'. searched paths: none
task: Failed to run task "release-snapshot": exit status 1
这引出了我的第一个问题:如果我使用的是netgo,为什么还会链接libresolv?
为了确认这是否是唯一的问题,我从Mac SDK中提取了libresolv.tbd文件并链接了它们,这实际上对amd64架构有效。但奇怪的是,arm64目标平台却失败了,并出现了新的错误:
error=failed to build for darwin_arm64: exit status 1: # github.com/jonathanhope/armaria/cmd/cli
/nix/store/dwmb0qcai52d0zkgpm6f5ifx2a8yvsdg-go-1.21.3/share/go/pkg/tool/linux_amd64/link: running zig failed: exit status 1
error: unable to find framework 'CoreFoundation'. searched paths: none
这引出了我的第二个问题:为什么amd64目标平台不需要CoreFoundation,而arm64目标平台却需要?
我知道osxcross项目,但我不认为在其许可证下允许使用MacOS SDK。以我这个外行人的眼光来看,该许可证似乎禁止在Github上托管它并且禁止从Linux主机使用它进行编译。这很遗憾,因为我知道用那种方法可以解决这个问题。
我想,这最终会让我使用GitHub上的MacOS运行器。我并不反对那10分钟的构建时间,但遗憾的是我将无法在本地测试发布流水线。我发这个帖子,是希望万一有人有任何想法。
更多关于Golang中CGo、Zig、netgo和libresolv的使用探讨的实战教程也可以访问 https://www.itying.com/category-94-b0.html


