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

时间:2018-08-20 11:23:30

标签: gcc nix

我正在使用Ubuntu 18.x在WSL上运行Nix。

我用$ 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

我对如何使构建环境正常工作一无所知。我找不到任何有关继续使用哪些软件包的文档。这是非常简单的东西。

1 个答案:

答案 0 :(得分:1)

简而言之,使用Nix所做的事情有所不同。使用Nix时,您无需创建安装大多数发行版的工具和库,而是创建一个“ Nix表达式”,该声明声明您的构建依赖关系和编译程序的说明。例如,假设您有一个带有以下源代码的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符号链接,该链接指向上面使用的$out目录。上面的installPhase将二进制文件复制到$out/bin,因此可以通过运行./result/bin/hello

执行该程序。

Nix语言在其documentation中进行了描述,您可以从Nixpkgs documentation中获得如何使用它来构建事物的概述。