微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 buildmode=c-shared 为 windows/arm 和 arm64 编译 Go

如何解决使用 buildmode=c-shared 为 windows/arm 和 arm64 编译 Go

我需要通过 C 将一个 go 库编译为一个 DLL,该 DLL 可以在 ARM/ARM64 Windows 上通过 PInvoke 使用。我发现了许多关于此的未解决的问题、主题和讨论,听起来它可能部分起作用。但如果我像这样尝试:

    export CC="arm-none-eabi-gcc"
    export CXX="arm-none-eabi-g++"
    export GOOS="windows"
    export GOARCH="arm"
    export GOARM=7
    export CGO_ENABLED="1"
    go build -ldflags="-s -w" -o my_library.dll -buildmode c-shared

我得到结果 buildmode c-shares is not supported on windows/arm。所以好像还是不支持

一个问题是我需要设置 CGO_ENABLED 并通过 C/C++-Toolchain 路由编译,因为我必须添加由 SWIG 生成的 C 文件。我使用包 gcc-arm-none-eabi 的工具链在 Ubunu 20.04 上尝试了上述操作。

我不是 C/C++/Go-pro - 但同样适用于几乎所有其他平台,如 Windows、Linux、Android、Mac 和 iOS。后者也是基于 ARM64,所以我真的不明白为什么这是不可能的 - 尽管我很重视这一切的困难。

所以,如果有更深入了解的人可以在这里帮助我,那就太好了。

只是为了澄清:我不想/不需要为 ARM/ARM64 编译 Go 本身。我需要为该平台编译一个 Go 程序(在 Surface 或 Hololens 上使用我的 .Net 库)。

解决方法

我不想/不需要为 ARM/ARM64 编译 Go 本身。我需要为那个平台编译一个 Go 程序

应该可以,使用 Go 1.17 beta

Its documentation 确实提到:

窗口

Go 1.17 在 Windows(windows/arm64 端口)上添加了对 64 位 ARM 架构的支持。
此端口支持 cgo。

OP topperdel 中的 the comments 指的是 CL 326310

cmd/internal/sys:将 windows/arm64 标记为 c-shared-capable

平台现在支持 c-shared,所以打开这个。
我已经使用 WireGuard Tunnel Library 对它进行了一次小型冒烟测试,它能够通过数据包并且总体上运行良好。

由于 WireGuard Tunnel Library 在幕后使用了相当多的 Go 功能,我认为这是一个很好的测试,很多应该工作的东西都在工作。所以这次提交启用了它。

为了让所有的测试都通过,我们做了一些小的改动,比如 将 -Wno-dll-attribute-on-redeclaration 传递给 clang 并避免 将共享库加载到手臂上的 Powershell。

正如这些问题所表明的,这是一项仍在进行中的工作:

  • issue 46502(“runtime:由于重新声明警告(升级为测试错误),windows-arm64-aws 构建器上的多个测试失败”),
  • issue 46701(“arm64/arm 上的 Powershell 无法加载 arm64/arm 二进制文件,因为它是一个英特尔进程”)

测试部分现已(2021 年 6 月 13 日)以 golang/go commit 1ed0d12 结束:

runtimetestprogcgo:不要直接从 Go 调用导出的 Go 函数

改为通过 C 函数路由,以避免声明冲突 cgo 注释中所需的声明与声明之间 由 cgo_cgo_export.h 中生成。

这不是用户代码会做的事情,所以没必要做 在 cgo 工作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。