我在 Ubuntu 18.x 的 WSL 上运行 Nix。
我安装了 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
Run Code Online (Sandbox Code Playgroud)
似乎我期望 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
Run Code Online (Sandbox Code Playgroud)
我不知道如何让构建环境正常工作。我找不到任何关于我需要启动哪些软件包的文档。这是非常简单的事情。
简而言之,Nix 的做法有所不同。使用 Nix 时,您不需要像大多数发行版那样安装工具和库,而是创建一个“Nix 表达式”,它声明您的构建依赖项和编译程序的说明。例如,假设您有一个hello.cc源代码:
#include <iostream>
using namespace std;
int main()
{
cout << "Hello, World!";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
要使用 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
'';
}
Run Code Online (Sandbox Code Playgroud)
...你可以像这样构建:nix build
您最终会得到一个./result指向$out上面使用的目录的符号链接。上面installPhase将二进制文件复制到$out/bin,因此可以通过运行来执行程序./result/bin/hello
Nix 语言在其文档中进行了描述,您可以从 Nixpkgs文档中获取如何使用它来构建内容的概述。
| 归档时间: |
|
| 查看次数: |
3100 次 |
| 最近记录: |