代码之家  ›  专栏  ›  技术社区  ›  Stephane Rolland

不能使用nixos派生包含<ncurses.h>头

  •  0
  • Stephane Rolland  · 技术社区  · 6 年前

    我有这个简单的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++的容器构建。但我想避免这种情况,真的很尴尬,并正确使用尼克斯系统。

    你知道我明显错过了什么吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Robert Hensing Nguyen Hoang Hiep    6 年前

    在安装了 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
    
        2
  •  0
  •   Stephane Rolland    6 年前

    根据之前的答案建议,我可以用以下方法编译:

    #!/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
    

    但我觉得非常尴尬,需要有具体的道路尼克斯商店。

    我很乐意知道尼克斯那样做的方式。