如何解决使用 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 结束:
runtime
:testprogcgo
:不要直接从 Go 调用导出的 Go 函数
改为通过 C 函数路由,以避免声明冲突
cgo
注释中所需的声明与声明之间
由 cgo
在 _cgo_export.h
中生成。
这不是用户代码会做的事情,所以没必要做 在 cgo 工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。