不能使用 nixos 推导包含 <ncurses.h> header
Cannot include <ncurses.h> header using nixos derivation
我有这个简单的 C++ 代码:
#include <ncurses.h>
int main ()
{
return 0;
}
我尝试用这个 shell.nix
文件构建
{stdenv , ncurses}:
with import <nixpkgs> {}; {
testEnv = stdenv.mkDerivation {
name = "helloTest";
buildInputs = [stdenv ncurses];
};
}
运行命令:
g++ main.cpp -lncurses -o main
我得到错误输出:
main.cpp:1:10: fatal error: ncurses.h: No such file or directory
#include <ncurses.h>
^~~~~~~~~~~
尽管我确实安装了 ncurses
:
$ locate ncurses.h
/nix/store/ffjl7aw7f0gjwv4gb4mgb0w49v5dhrkg-ncurses-6.0-20171125-dev/include/ncurses.h
目前我正在使用一个专用的 docker
容器来进行 C++ 构建。但我想避免那个,真的很尴尬,并正确使用nix系统。
知道我明显遗漏了什么吗?
根据之前回答的建议,我可以愉快地编译:
#!/usr/bin/env bash
ncursesInclude="/nix/store/ffjl7aw7f0gjwv4gb4mgb0w49v5dhrkg-ncurses-6.0-20171125-dev/include/"
ncursesLib="/nix/store/54cwjh1lsmjpk2cbs43gw89w4zhk3ybb-ncurses-6.0-20171125/lib/"
g++ main.cpp -I$ncursesInclude -L$ncursesLib -lncurses -o main
但我觉得非常尴尬,需要有通往 nix 商店的具体路径。
我很乐意知道这样做的最佳方式。
修复 shell.nix
文件并输入以下命令后,它似乎工作正常。 shell.nix
的问题在于它被不必要地包裹在 lambda 中。它的参数无论如何都被 with;
表达式遮蔽了,所以你可以只删除外部 lambda。
$ cat shell.nix
with import <nixpkgs> {};
{
testEnv = stdenv.mkDerivation {
name = "helloTest";
buildInputs = [stdenv ncurses];
};
}
$ nix-shell
[nix-shell:~/tmp/so-54524324]$ g++ main.cpp -lncurses -o main
[nix-shell:~/tmp/so-54524324]$ ./main
[nix-shell:~/tmp/so-54524324]$ echo $?
0
我有这个简单的 C++ 代码:
#include <ncurses.h>
int main ()
{
return 0;
}
我尝试用这个 shell.nix
文件构建
{stdenv , ncurses}:
with import <nixpkgs> {}; {
testEnv = stdenv.mkDerivation {
name = "helloTest";
buildInputs = [stdenv ncurses];
};
}
运行命令:
g++ main.cpp -lncurses -o main
我得到错误输出:
main.cpp:1:10: fatal error: ncurses.h: No such file or directory
#include <ncurses.h>
^~~~~~~~~~~
尽管我确实安装了 ncurses
:
$ locate ncurses.h
/nix/store/ffjl7aw7f0gjwv4gb4mgb0w49v5dhrkg-ncurses-6.0-20171125-dev/include/ncurses.h
目前我正在使用一个专用的 docker
容器来进行 C++ 构建。但我想避免那个,真的很尴尬,并正确使用nix系统。
知道我明显遗漏了什么吗?
根据之前回答的建议,我可以愉快地编译:
#!/usr/bin/env bash
ncursesInclude="/nix/store/ffjl7aw7f0gjwv4gb4mgb0w49v5dhrkg-ncurses-6.0-20171125-dev/include/"
ncursesLib="/nix/store/54cwjh1lsmjpk2cbs43gw89w4zhk3ybb-ncurses-6.0-20171125/lib/"
g++ main.cpp -I$ncursesInclude -L$ncursesLib -lncurses -o main
但我觉得非常尴尬,需要有通往 nix 商店的具体路径。
我很乐意知道这样做的最佳方式。
修复 shell.nix
文件并输入以下命令后,它似乎工作正常。 shell.nix
的问题在于它被不必要地包裹在 lambda 中。它的参数无论如何都被 with;
表达式遮蔽了,所以你可以只删除外部 lambda。
$ cat shell.nix
with import <nixpkgs> {};
{
testEnv = stdenv.mkDerivation {
name = "helloTest";
buildInputs = [stdenv ncurses];
};
}
$ nix-shell
[nix-shell:~/tmp/so-54524324]$ g++ main.cpp -lncurses -o main
[nix-shell:~/tmp/so-54524324]$ ./main
[nix-shell:~/tmp/so-54524324]$ echo $?
0