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 中进行了描述。
我是 运行 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 中进行了描述。