【问题标题】:Compiling Golang applications under WineWine下编译Golang应用
【发布时间】:2014-09-19 19:38:54
【问题描述】:

我正在尝试为用 Go 编写的应用程序创建一个无人参与的(也许是确定性的)构建过程。

这个想法是使用创建一个 Dockerfile 来安装所有先决条件,以便与其他人轻松共享构建过程,并且不需要真正的 Windows 安装。

但是,我一直在尝试构建具有 C 绑定的库。

我收到了这个非常非描述性的错误

C:\godev\src\github.com\obscuren\secp256k1-go>go build --work
WORK=C:\users\root\Temp\go-build287695705
# _/C_/godev/src/github.com/obscuren/secp256k1-go
copying $WORK\_\C_\godev\src\github.com\obscuren\secp256k1-go\_obj\_cgo_defun.8 to $WORK\_\C_\godev\src\github.com\obscuren\secp256k1-go.a: write $WORK\_\C_\godev\src\github.com\obscuren\secp256k1-go.a: Access denied.

带有-x 的完整日志可以be found here

我可以在 OS X 和“真正的”Windows 安装上构建这个库。

任何帮助将不胜感激。

编辑:

使用 OneofOne 的大纲也会给我一些错误。

# runtime/cgo
pkg/runtime/cgo/cgo.go:26:46: fatal error: sys/types.h: No such file or directory.
compilation terminated.

最初我在为 Go 启用交叉编译时收到此错误。我通过安装 gcc-multilib 克服了这个问题。下一个问题如下。

# runtime/cgo
gcc: error: unrecognized command line option ‘-mthreads’

谷歌搜索此错误会导致两次命中,这对我的用户案例没有用处。我希望任何人以前都经历过这种情况。

编辑 2:

不确定是什么解决了它,但我做到了

apt-get install gcc-multilib
apt-get install gcc-mingw-w64

并用过

GOOS=windows GOARCH=386 CGO_ENABLED=1 CXX_FOR_TARGET=i686-w64-mingw32-g++ CC_FOR_TARGET=i686-w64-mingw32-gcc ./make.bash

现在我更进一步了。 :)

【问题讨论】:

  • 它说“拒绝访问”,所以可能是权限问题。
  • 我考虑过,但一切都以 root 身份运行。

标签: go wine


【解决方案1】:

虽然不是确切问题的答案,但正确的做法是在 Linux 上使用 mingw64 交叉编译 windows 可执行文件,我在我的项目中使用过几次,效果很好。

首先,您必须在 Go 中启用交叉编译:

┌─ oneofone@Oa [~]                                                                                                               
└──➜ cd $GOROOT/src
┌─ oneofone@Oa [/u/s/g/src]                                                                                                      
└──➜ env GOOS=windows GOARCH=386 CGO_ENABLED=1 ./make.bash #use GOARCH=amd64 for 64bit windows binaries
....compile progress...
┌─ oneofone@Oa [/u/s/g/src]                                                                                                      
└──➜ cd /tmp

┌─ oneofone@Oa [/tmp]                                                                                                            
└──➜ cat win-cgo-test.go 
package main

/*
#include <stdlib.h>
#include <stdio.h>
*/
import "C"
import "unsafe"

func main() {
        hello := C.CString("Hello world")
        defer C.free(unsafe.Pointer(hello))
        C.puts(hello)
}

然后在 Arch Linux 上安装 mingw 工具链:

将此添加到 /etc/pacman.conf:

[mingw-w64]
SigLevel = Never
Server = http://downloads.sourceforge.net/project/mingw-w64-archlinux/$arch
Server = http://arch.linuxx.org/archlinux/$repo/os/$arch

然后运行pacman -Syu mingw-w64-toolchain mingw-w64

编辑:另外,如果您使用的是 64 位发行版,则需要 multilib gcc,在 ArchLinux 上通常为 pacman -Sy multilib-devel

取决于您的发行版,通常有本地仓库或有人为 mingw 制作了自定义仓库。

全部安装后,您可以通过运行以下命令编译您的 Windows 可执行文件:

┌─ oneofone@Oa [/tmp]                                                                                                            
└──➜ env GOOS=windows GOARCH=386 CGO_ENABLED=1 CC=i686-w64-mingw32-gcc CXX=i686-w64-mingw32-g++ CGO_LDFLAGS="-lssp" go build win-cgo-test.go 
┌─ oneofone@Oa [/tmp]                                                                                                            
└──➜ file win-cgo-test.exe 
win-cgo-test.exe: PE32 executable (console) Intel 80386 (stripped to external PDB), for MS Windows

我将它们作为我的 shell 中的别名,https://github.com/OneOfOne/etc-fish/blob/master/env/01-go.fish

我使用Fish,但是它们很简单,可以移植到 Bash(或其他任何东西)。

//编辑,加分

如果您想获取所需 dll 的列表(99% 的情况下您不需要复制任何内容,只需要 1%):

└──➜ i686-w64-mingw32-objdump -p win-cgo-test.exe | grep "DLL Name:"
        DLL Name: ws2_32.dll
        DLL Name: advapi32.dll
        DLL Name: ntdll.dll
        DLL Name: kernel32.dll
        DLL Name: winmm.dll
        DLL Name: msvcrt.dll

【讨论】:

  • 感谢您精心撰写的文章。我会尽快测试它,看看我是否可以让它工作:)
  • 我尝试了很多方法,但仍然无法启用交叉编译:# runtime/cgo pkg/runtime/cgo/cgo.go:26:46: fatal error: sys/types .h:没有这样的文件或目录。有任何想法吗? ^ 编译终止。
  • 更新了 OP。
  • 如果你在 amd64 上,我添加了一个编辑提到需要 multilib 工具链。
  • 任何想要从 Linux(通常包括 Ubuntu)构建 Windows exe 并能够使用 CGo 的人都可能对 this summary 我的尝试感兴趣。
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
相关资源
最近更新 更多