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



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

我安装了 GCC$ nix-env -i 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 表达式",该表达式声明您的构建依赖项和编译程序的说明。例如,假设您有一个包含以下源代码的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 语言在其文档中进行了描述,您可以从 Nixpkgs 文档中获得如何使用它来构建内容的概述。

只需使用 gcc 获取 Nix shell 即可。

nix shell nixpkgs#gcc # with flakes
nix-shell -p gcc # without flakes

然后去gcc <anything>似乎有效。

如果你想要其他依赖项,你也可以添加它们:

nix-shell -p pkgconfig gcc openssl
g++ $(pkg-config --libs --cflags openssl) solution.cpp

或者最终建立一个 .nix 文件,该文件是此的非临时版本

最新更新