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

在Nix Flake Shell中无法编译含SQLite依赖的Go代码

解决Nix Flake Shell中Go CGO编译的flag provided but not defined: -E错误

问题根源

这个错误是因为-E参数被错误传递给了go命令(而非gcc编译器),本质是手动配置的环境变量破坏了Nix为Go预设的CGO编译环境——Nix打包的Go已经内置了正确的路径和编译器关联,手动覆盖GOROOT会导致命令调用逻辑混乱。

修复方案

1. 移除GOROOT的PATH覆盖

在shellHook中删除$GOROOT/bin的PATH设置,保留GOPATH即可:

# 修改前
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH

# 修改后
export PATH=$GOPATH/bin:$PATH

2. 清理冗余依赖

gotools和go-tools是重复包,移除其中一个避免潜在冲突。

3. 简化CGO配置

无需手动设置CGO_ENABLED=1,Nix的Go包会根据依赖自动处理CGO状态;如果必须启用,依赖中的gcc和glibc.dev已经提供了完整的编译环境。

修正后的Flake配置

{
  description = "PoC";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs";
    flake-utils.url = "github:numtide/flake-utils";

    gomod2nix = {
      url = "github:tweag/gomod2nix";
      inputs.nixpkgs.follows = "nixpkgs";
      inputs.utils.follows = "utils";
    };
  };

  outputs = { self, nixpkgs, flake-utils, gomod2nix }:
    flake-utils.lib.eachDefaultSystem (system:
      let
        pkgs = import nixpkgs {
          inherit system;
          overlays = [ gomod2nix.overlays.default ];
        };
      in
      {
        packages = {
          default = pkgs.gnumake;
        };
        formatter = pkgs.nixpkgs-fmt;

        devShell = pkgs.mkShell {
          buildInputs = with pkgs; [
            gnumake
            gcc
            glibc.dev

            go
            gopls
            go-tools
            gomod2nix.packages.${system}.default
            golangci-lint
            protobuf3_20
          ];
          buildPhase = "make";
          shellHook = ''
            export PATH=$GOPATH/bin:$PATH
            make dep
          '';
        };
      }
    );
}

验证步骤

如果问题仍存在,执行以下命令排查环境:

  • which go:确认路径指向Nix Store中的Go二进制文件
  • echo $CGO_CC:确认指向Nix提供的gcc

内容的提问来源于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 14:20:24