从Golang 14升级到15后为何调用了C语言?

从Golang 14升级到15后为何调用了C语言? 我正在尝试从Go调用一个C共享库,但总是遇到一个错误:

command-line-arguments cgo: exec C:\Program: exec: “C:\Program”: file does not exist

今天,我将我的Go从1.14升级到了1.15。升级后,运行任何涉及调用C的项目时都会出现这个提示。

在使用1.14版本时,我可以正常工作。

package main

import "C"
import "fmt"

func main() {
	fmt.Println(C.add(1, 3))
}

image

我已经安装了 Mingw-w64


更多关于从Golang 14升级到15后为何调用了C语言?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

如果你通过终端构建和运行,而不是通过某些IDE按钮呢?

更多关于从Golang 14升级到15后为何调用了C语言?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我尝试在终端中运行,在终端里一切正常

最后,我将 mingw-w64 放在了一个没有空格的目录中,这样IDE和终端就可以正常运行了。

感谢您的帮助。

这个错误是由于Go 1.15中cgo的一个已知问题导致的,特别是在Windows系统上。当C编译器路径包含空格(如"C:\Program Files")时,cgo无法正确解析路径。

在Go 1.15中,cgo对Windows路径的处理发生了变化,导致包含空格的路径被错误地截断。你需要确保C编译器路径不包含空格,或者使用短路径格式。

以下是几种解决方案:

方案1:使用短路径格式

# 获取Mingw-w64的短路径
dir /x "C:\Program Files"
# 输出可能类似:C:\PROGRA~1\...

# 然后设置环境变量
set CC=C:\PROGRA~1\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin\gcc.exe

方案2:移动Mingw-w64到无空格路径 将Mingw-w64安装到没有空格的路径,例如:

C:\mingw64\

然后更新环境变量:

set CC=C:\mingw64\bin\gcc.exe
set PATH=C:\mingw64\bin;%PATH%

方案3:使用引号包装路径(某些情况下有效) 在你的构建脚本或环境变量中:

set CC="C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin\gcc.exe"

方案4:修改Go环境配置 创建一个build.bat文件:

@echo off
set CC="C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin\gcc.exe"
go build -x

验证解决方案的测试代码:

// test_cgo.go
package main

// #cgo CFLAGS: -I.
// #include "add.c"
import "C"
import "fmt"

func main() {
    result := C.add(1, 3)
    fmt.Printf("Result: %d\n", result)
}
// add.c
int add(int a, int b) {
    return a + b;
}

检查当前配置:

# 查看当前cgo配置
go env CC
go env CGO_ENABLED
go env

# 如果CC未设置,可以显式设置
go env -w CC=gcc

这个问题在Go 1.16中已经得到修复,但如果你需要继续使用Go 1.15,上述解决方案应该能解决你的问题。最可靠的方案是将Mingw-w64移动到没有空格的路径。

回到顶部