当前位置: 首页 > 面试题库 >

从Mac到Windows的Go / Golang交叉编译:致命错误:找不到“ windows.h”文件

柯冯浩
2023-03-14
问题内容

摘要 :当我尝试交叉编译.go源文件(包括在文件链中某个位置的C文件),并从Mac主机定位Windows AMD64时,我得到:

/usr/local/go/src/runtime/cgo/gcc_windows_amd64.c:8:10: fatal error: 'windows.h' file not found

纯粹的Go代码似乎可以交叉编译而不会出错;当涉及C文件时,有没有办法获取正确的头文件进行交叉编译?

更多详细信息
:我在Mac上安装了LiteIDE,以用于某些.go项目,而LiteIDE使将其他平台作为构建目标变得相对容易。我纯粹在Go上的一个小型测试项目中对其进行了测试,它似乎没有错误地运行。

后来我在一个更大的当前项目中进行了尝试,并且不得不在IDE中调整一些环境设置才能使其正常工作(关于未启用CGO的C文件的投诉,即使GOPATH在.bash_profile中设置并在echo中进行了验证,GOPATH的设置也不正确$
VARIABLE很好。)结果是

/usr/local/go/src/runtime/cgo/gcc_windows_amd64.c:8:10: fatal error: 'windows.h' file not found

尝试以Linux(os linux,arch amd64)为目标

# runtime/cgo
ld: unknown option: --build-id=none
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我已仔细检查是否已安装XCode;gcc已安装:

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr with-gxx-include-     dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/c++/4.2.1
Apple LLVM version 7.3.0 (clang-703.0.29)
Target: x86_64-apple-darwin15.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

…而Go是最新版本:

go version go1.6.2 darwin/amd64

我还检查了这是否仅来自LiteIDE(因为LiteIDE似乎会覆盖环境设置并忽略终端中的内容?);在控制台上进行尝试的示例给出了:

MyUsername$ env GOOS=windows GOARCH=amd64 CGO_ENABLED=1 go build -v
golang.org/x/net/html/atom
runtime/cgo
golang.org/x/crypto/ssh/terminal
golang.org/x/net/html
github.com/howeyc/gopass
# runtime/cgo
/usr/local/go/src/runtime/cgo/gcc_windows_amd64.c:8:10: fatal error: 'windows.h' file not found
github.com/andybalholm/cascadia
github.com/PuerkitoBio/goquery

我怀疑这是因为该应用程序在Go中使用了网络库,而且我认为本机库仍在调用一些C文件来填补空白。有没有一种方法可以获取在Linux /
Windows上构建的正确库,或者是否需要在目标平台上完成才能工作?

在主机平台上构建本机应用程序似乎可以正常工作。


问题答案:

要为CGO启用交叉编译,您需要有一个本地工具链,可以为该目标编译C代码。

我对Mac OS X不太熟悉,但是在Arch Linux上,我要做的就是使用以下命令安装mingw-w64-toolchain并编译go代码:

env GOOS="windows" GOARCH="386"   CGO_ENABLED="1" CC="i686-w64-mingw32-gcc"   go build
// or to target win 64
env GOOS="windows" GOARCH="amd64" CGO_ENABLED="1" CC="x86_64-w64-mingw32-gcc" go build

在OSX上,您可以使用homebrew安装mingw: brew install mingw-w64

但是,关于其他错误消息,ld: unknown option: --build-id=none似乎是一个错误,您可能需要在Go
问题跟踪器中报告该错误消息。



 类似资料:
  • 问题内容: 我已经安装在Windows机器上的Go 1.2,写了一个虚拟的程序和设置环境变量,并以“AMD64”及“LINUX”。 当我发出“ ”命令时,出现错误: 这是什么意思? 问题答案: 它告诉您需要先构建所有工具,然后才能使用它们。 如果您的Windows GOARCH是amd64,则可以通过运行以下小批处理程序来“构建”所有必需的工具: 如果成功,那么您应该能够执行您所描述的操作(只使用

  • 问题内容: 基本上,我在Linux上进行开发时,尝试将最简单的代码编译到Windows。 我通过搜索互联网找到了这些命令: 可悲的是,它们都不起作用。它给我关于标准箱丢失的错误 有没有办法在Windows上运行的Linux上编译代码? 问题答案: Rust发行版仅提供主机系统的编译库。但是,根据Rust上Arch Linux的Wiki页面 ,您可以从系统目录中适当位置(位于或中,具体取决于Wind

  • 我试图遵循各种建议,但它们没有我的特定错误消息:crt2.o:crtexe.c:(.rdata$.refptr.__onexitend[.refptr.__onexitend]+0x0):未定义对`__onexitend'的引用collect2:error:ld返回1退出状态 希望得到一些东西,但它爆炸了。输出如下所示:/usr/bin/x86_64-w64-mingw32-ld://home/v

  • 问题内容: 我有关于交叉编译的问题。 这是我使用的一个简单的hello world代码。 我正在使用从导师图形下载的arm-none-eabi-g ++。这是错误。我不知道会错过什么lib。 这是编译器版本。 $ arm-linux-gnueabi-g ++ -v 使用内置规格。COLLECT_GCC = / home / kang / Utils / arm-2013.05 / bin / ar

  • 我在c代码中使用include: 。当我用“gcc”编译器编译它时,我没有任何错误,但当我用交叉编译器“arm-linux-gnueabi-gcc”编译它时,我有以下错误:

  • 因此我正在尝试使用emScripten编译以下代码: 我的实际代码要大得多,但我在这里缩短了它,以强调我的主要疑虑(我留下了我正在使用的所有头文件)。这段代码使用g++进行了完美的编译,并给出了所有预期的输出。 但当我使用将其编译为web程序集时,它给出了以下错误: 为什么EMCC没有找到这个文件?在C++中是否有处理unordered_maps的替代方法? 我在使用tr1时遇到了堆栈溢出问题中的