You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Makefile在Nix Flake Shell中编译带SQLite依赖的Go代码失败

问题解决:Make执行go build时出现flag provided but not defined: -E报错

问题原因

你在Makefile里把CC变量设为了go,但CC是Make的内置变量,默认指向C编译器。Make会自动给CC相关的命令注入C编译器的默认参数(比如-E),这些参数被传递给go build后,Go工具链不识别,就抛出了报错。

而直接执行nix develop --command go build -o foo cmd/main.go能正常运行,是因为这个命令直接调用Go,没有经过Make,不会被注入额外的C编译参数。

解决方案

把Makefile里的CC变量换成非内置的名称,比如GO,避免Make自动添加无效参数。修改后的Makefile如下:

GO=go
FMT=gofmt
NAME=go-nix
BASE_DIR=/script
OS=linux
ARCH=386
ARM=

default: fmt
	$(GO) build -o $(NAME) cmd/main.go

fmt:
	$(GO) fmt ./...

如果坚持要用CC,可以在Makefile开头清空C相关的内置参数,不过不推荐这种方式(容易混淆):

CC=go
CFLAGS=  # 清空C编译器默认参数
FMT=gofmt
NAME=go-nix
BASE_DIR=/script
OS=linux
ARCH=386
ARM=

default: fmt
	$(CC) build -o $(NAME) cmd/main.go

fmt:
	$(CC) fmt ./...

修改后执行make,就能正常构建了。

内容的提问来源于stack exchange,提问作者vincenzopalazzo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 07:04:53