当使用import "C"且GOARCH=386时,出现了Go Build错误“build constraints exclude all Go files”。

4

我正在使用CGO包导入C代码,并希望构建一个适用于Windows的x86 (386)版本。我发现这可以通过设置GOARCH=386来实现。 在默认环境设置下(GOARCH=amd64),它可以正常构建。但是,当我将环境变量设置为“386”时,出现错误:构建限制排除了我的文件中所有Go文件

// hello.go
package main

/*
int CFunc() {
}
*/
import "C"

import (
    "fmt"
)

func main() {
    fmt.Println("Hello, Go!")
}

go.mod

module hello

go 1.16

我做:

go build

我得到:

C:\Users\basse\source\repos\xhptdc8_babel\go\info\hello>go build
package hello: build constraints exclude all Go files in C:\Users\basse\source\repos\xhptdc8_babel\go\info\hello

试验:

  • 没有导入"C",我不会出现错误。
  • 使用// +build windows,386// +build windows,386,!cgo,在package main之前,仍然会出现相同的错误。

所有细节都可以在Go Issue中找到。

设置

set CGO_ENABLED=1  

生成另一种类型的错误:
F:/Work/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible F:/Work/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/lib/libmingwthrd.a when searching for -lmingwthrd
F:/Work/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible F:/Work/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/lib\libmingwthrd.a when searching for -lmingwthrd
F:/Work/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible F:/Work/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/lib/libmingwthrd.a when searching for -lmingwthrd
F:/Work/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lmingwthrd
.
.
.

你是否尝试设置CGO_ENABLED=1,就像在那个问题中所提到的一样? - JimB
谢谢Jim。是的,我尝试了,但是出现了不同类型的错误:F:/Work/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/lib/libmingwthrd.a when searching for -lmingwthrd F:/Work/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lmingwthrd . . - Bassem Ramzy
请在问题中更新相关信息,我们无法在评论中阅读长文本或代码。 - JimB
这些不是 Go 错误,你还需要32位的库来构建 C 代码。 - JimB
@Neville Cook,我已经添加了这个问题的答案。 - Bassem Ramzy
显示剩余4条评论
1个回答

4
问题已解决,感谢@JimB的帮助。
在代码中确保使用 import "C" 和正确的 CGO 指令/库 在go代码中,像这样:
/*
    #cgo CFLAGS: -Wall -g -I../../../../lib/include/
    #cgo 386   LDFLAGS: -L./ -l:../../../../lib/x86dummy/xhptdc8_driver
    #include "xhptdc8_interface.h"
*/
import "C"

在构建代码时,请确保运行以下命令:

set GOARCH=386
set CGO_ENABLED=1
set GOGCCFLAGS=-m32

链接详细介绍了使用CGO和自定义库构建Go代码的步骤和经验教训。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接