Nix 和 GCC - `找不到 crt1.o`

Nix and GCC - `cannot find crt1.o`

我是 运行 WSL 上的 Nix Ubuntu 18.x。

我用 $ nix-env -i gcc 安装了 GCC,它安装了 gcc-7.3.0

我正在尝试使用 GCC 编译一个简单的 CPP 文件(由 Ferret 生成)。但是 GCC 出现以下错误:

$ g++ -std=c++11 -x c++ test_1.cpp -o test_1
/usr/bin/ld: cannot find crt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
collect2: error: ld returned 1 exit status

我似乎希望 Nix 包含通用依赖项以及 GCC(build-essential 等效项),但我认为这不是真的。

使用 Nix 进行搜索(nix-env -qaP 'gcc'nix-env -qaP --description | grep -i gcc)并没有提供太多帮助。

其他帖子提到安装 gcc-multilib(apt 包)。 Nix 中唯一提到的是测试包:

$ nix-env -qaP --description | grep -i multilib
nixpkgs.tests.cc-multilib-gcc                                            cc-multilib-test                               
nixpkgs.tests.cc-multilib-clang                                          cc-multilib-test

我不知道如何让构建环境正常工作。我找不到任何关于我需要使用哪些包的文档。这是非常简单的事情。

简而言之,Nix 的处理方式有所不同。使用 Nix 时,您无需像大多数发行版那样安装工具和库,而是创建一个 "Nix expression" 来声明您的构建依赖项和编译程序的说明。例如,假设您有一个带有此源代码的 hello.cc

#include <iostream>
using namespace std;

int main() 
{
    cout << "Hello, World!";
    return 0;
}

要使用 Nix 编译它,您可以使用 default.nix 文件(在同一目录中),如下所示:

let
    pkgs = (import <nixpkgs>) {};
    gcc = pkgs.gcc;
    stdenv = pkgs.stdenv;
in
    stdenv.mkDerivation {
        name = "hello";
        version = "1.0.0";
        src = ./.;
        phases = [ "unpackPhase" "buildPhase" "installPhase" ];

        buildPhase = ''
            ${gcc}/bin/g++ -std=c++11 -x c++ hello.cc -o hello
        '';

        installPhase = ''
            mkdir -p $out/bin
            cp hello $out/bin
        '';
    }

...你可以这样构建:nix build

您最终会得到一个 ./result 符号 link,它指向上面使用的 $out 目录。上面的installPhase把binary复制到$out/bin,所以程序可以被运行./result/bin/hello

执行

Nix 语言在其 documentation and you can get an overview of how to use it to build things from the Nixpkgs documentation 中进行了描述。