在Wine下编译Golang应用程序

Mar*_*ran 4 wine go

我正在尝试为用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.
Run Code Online (Sandbox Code Playgroud)

可以在此处找到带有-x的完整日志。

我可以在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.
Run Code Online (Sandbox Code Playgroud)

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

# runtime/cgo
gcc: error: unrecognized command line option ‘-mthreads’
Run Code Online (Sandbox Code Playgroud)

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

编辑2:

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

apt-get install gcc-multilib
apt-get install gcc-mingw-w64
Run Code Online (Sandbox Code Playgroud)

和二手

GOOS=windows GOARCH=386 CGO_ENABLED=1 CXX_FOR_TARGET=i686-w64-mingw32-g++ CC_FOR_TARGET=i686-w64-mingw32-gcc ./make.bash
Run Code Online (Sandbox Code Playgroud)

现在,我又走了一步。:)

One*_*One 5

虽然不能回答确切的问题,但正确的方法是在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)
}
Run Code Online (Sandbox Code Playgroud)

然后在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
Run Code Online (Sandbox Code Playgroud)

然后跑 pacman -Syu mingw-w64-toolchain mingw-w64

编辑:同样,如果您使用的是64位发行版,则通常需要在ArchLinux上使用multilib gcc 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
Run Code Online (Sandbox Code Playgroud)

我在外壳程序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
Run Code Online (Sandbox Code Playgroud)