使用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
相关产品推荐
相关产品推荐

