Windows下Golang CGO编译报cc1.exe权限拒绝及无法解析_cgo_.o错误
问题原因
核心错误是你的CGO_CFLAGS环境变量配置错误:从go env输出可以看到 set CGO_CFLAGS=-g -o2,这里的优化参数写错了:
- GCC 中
-O(大写字母O)后面跟数字才是指定优化等级,-O2代表开启二级优化 - 你写成了小写的
-o2,而-o(小写字母o)是GCC的输出文件参数,相当于告诉GCC要把编译结果输出到名为2的文件中
两种报错对应的逻辑:
- 普通权限编译时,编译
runtime/cgo的工作目录是D:\Program Files\Go\src\runtime\cgo,普通用户没有权限在系统级的GOROOT目录下新建文件,所以直接报cc1.exe: fatal error: opening output file 2: Permission denied - 管理员权限编译时,有权限在该目录下生成
2文件,但本该生成的_cgo_.o目标文件内容为空/异常,所以cgo工具无法识别它的格式,报cannot parse gcc output $WORK\b001\\_cgo_.o as ELF, Mach-O, PE, XCOFF object
而GoLand调试模式能正常运行的原因是:调试模式下Go会自动添加-gcflags "all=-N -l"参数,会覆盖你自定义的错误CGO_CFLAGS配置,强制关闭C代码优化,避免了错误参数的影响。
解决方法
临时验证方案
在当前编译的CMD窗口执行以下命令修正配置,再重新编译即可:
set CGO_CFLAGS=-g -O2 go build -x -o text.exe gb_test
永久生效方案
修改Windows系统环境变量:
- 按下
Win+R输入sysdm.cpl打开系统属性,切换到「高级」标签页,点击「环境变量」 - 在用户变量/系统变量列表中找到
CGO_CFLAGS,把变量值里的-o2改为-O2(大写O),如果没有特殊需求也可以直接删除该变量,使用Go默认的CGO编译参数 - 重启所有CMD/终端窗口,执行
go env CGO_CFLAGS确认配置已经生效,再重新编译即可。
内容的提问来源于stack exchange,提问作者ChenHN
相关产品推荐
相关产品推荐

