我正在使用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
我对如何使构建环境正常工作一无所知。我找不到任何有关继续使用哪些软件包的文档。这是非常简单的东西。
答案 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中获得如何使用它来构建事物的概述。