Go/Golang кросс-компиляция с Mac на Windows: фатальная ошибка: файл 'windows.h' не найден
Резюме: когда я пытаюсь кросс-компилировать исходный файл.go, включающий файл C где-то в цепочке файлов, ориентированный на Windows AMD64 с хоста Mac, я получаю:
/usr/local/go/src/runtime/cgo/gcc_windows_amd64.c:8:10: fatal error: 'windows.h' file not found
Чисто код Go, кажется, кросс-компиляции без ошибок; Есть ли способ получить правильные заголовочные файлы для кросс-компиляции, когда речь идет о файлах C?
Более подробная информация: я установил LiteIDE на свой Mac для работы над некоторыми проектами.go, и LiteIDE позволяет относительно просто ориентировать другие платформы в качестве целей сборки. Я протестировал его на небольшом тестовом проекте, который у меня был, чисто Go, и он, похоже, работал без ошибок.
Позже я попробовал его в текущем, более крупном проекте, и мне пришлось настроить несколько параметров env в IDE, чтобы заставить его работать (жалобы на файлы C без CGO и некорректную настройку GOPATH, даже если он установлен в.bash_profile и проверен в echo $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, кажется, переопределяет настройки env и игнорирует то, что находится в терминале?); пример попытки на консоли дает:
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 или это нужно сделать на целевых платформах, чтобы работать?
Создание собственных приложений на платформе хоста, похоже, работает без проблем.
1 ответ
Чтобы включить кросс-компиляцию для 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
Так что вы можете посмотреть, как получить mingw (или что-то подобное в OS X.
О другом сообщении об ошибке, хотя, ld: unknown option: --build-id=none
похоже на ошибку, вы можете сообщить об этом на трекере проблем Go.