c++ 在VSCode Mac上正确设置NCurses(curses.h)

k5hmc34c  于 2023-04-08  发布在  Vscode
关注(0)|答案(1)|浏览(233)

天哪,我可能真的很笨,但我不能把我的头绕在我应该如何正确链接<curses.h>到我的文件。我已经搜索了很多,但我似乎没有找到有用的信息。这是我的代码,一个非常基本的:

#include <iostream>
#include <curses.h>
#include <panel.h>
using namespace std;

int main()
{

    initscr();

    WINDOW *p = newwin(0, 0, LINES / 2, COLS / 2);
    PANEL *p_panel = new_panel(p);
    waddstr(p, "that's what i'm talking about!");

    update_panels(); 
    doupdate(); 
    endwin();
    return 0;
}

我通过terminal安装了ncurses library with brew,我有一个更新版本的clang。我试图在VSCode terminal中运行一个应用程序。下面是我得到的错误:

Undefined symbols for architecture x86_64:
  "_COLS", referenced from:
      _main in lab8-80f309.o
  "_LINES", referenced from:
      _main in lab8-80f309.o
  "_doupdate", referenced from:
      _main in lab8-80f309.o
  "_endwin", referenced from:
      _main in lab8-80f309.o
  "_initscr", referenced from:
      _main in lab8-80f309.o
  "_new_panel", referenced from:
      _main in lab8-80f309.o
  "_newwin", referenced from:
      _main in lab8-80f309.o
  "_update_panels", referenced from:
      _main in lab8-80f309.o
  "_waddnstr", referenced from:
      _main in lab8-80f309.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我尝试使用gcc手动链接它,我使用了以下命令:clang++ lab8.cpp -lpanel -lncurses和g++一样。它成功地执行了,文件“a.out”被创建,但没有什么区别。我也在某个地方看到,我可能需要在tasks.json中链接这个库,但我没有找到任何例子,我不知道。任何帮助都可能是伟大的

k7fdbhmy

k7fdbhmy1#

参考the documentation总是一个好主意。查看第2.1节,显示-lncurses是一个非常基本的ncurses程序所必需的,但那里没有关于面板的内容。向下滚动TOC以查找面板将导致第16.2节,其中清楚地显示-lpanel -lncurses是必需的。
gcc和g++只是Mac上LLVM的默认别名。clang++ lab8.cpp -lpanel -lncurses应该可以很好地完成这个任务。
在Mac和brew上安装了ncurses,阅读文档也很有帮助。在这种情况下,你只需要brew info ncurses。它明确指出:

For compilers to find ncurses you may need to set:
  set -gx LDFLAGS "-L/usr/local/opt/ncurses/lib"
  set -gx CPPFLAGS "-I/usr/local/opt/ncurses/include"

运行这些命令应该可以编译brew ncurses。相反,可以将带引号的字符串添加到编译命令中。
clang++ lab8.cpp "-I/usr/local/opt/ncurses/include" "-L/usr/local/opt/ncurses/lib" -lpanel -lncurses
上面的命令使用上面文档链接中的基本面板代码进行了测试,它在我的MacBook Pro上使用brew安装的ncurses工作。
这也是我推荐一个构建系统来自动化的地方。取决于你的程序有多琐碎,一个自制的makefile可能就足够了,但这似乎是学习cmake的好时机。
值得指出的是,你的代码什么也不做。它生成面板,然后程序立即结束。你画的东西不会简单地停留在屏幕上。
再一次,参考文档显示,endwin();之前的getch();行将“冻结”程序,这样你就可以看到你的文本。按任何键都应该结束你的程序。
我应该注意的是,我对你的示例代码做了另一个修改,这可能适用于你的整个项目,也可能不适用于你的整个项目。如果你包含panel.h,你不需要包含ncurses.h,而且你在示例中从来不需要iostream。所以我只有#include <panel.h>

相关问题