从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))
}

我已经安装了 Mingw-w64。
更多关于从Golang 14升级到15后为何调用了C语言?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
如果你通过终端构建和运行,而不是通过某些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移动到没有空格的路径。

