天哪,我可能真的很笨,但我不能把我的头绕在我应该如何正确链接<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中链接这个库,但我没有找到任何例子,我不知道。任何帮助都可能是伟大的
1条答案
按热度按时间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
。它明确指出:运行这些命令应该可以编译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>
。