我很难完成curses.h的绝对基础工作,即使我之前已经使用过它。我确定这是一个错过一些小事的经典案例,但我知道我的结局。
G ++绝对不会识别函数raw()或cbreak(),即使curses.h包含在我的.cpp和头文件中,和链接到编译时(最小版本):
g++ debugC.cpp -lcurses
相关代码为:
#include <curses.h>
#include "debugC.h"
#include "machine.h"
using namespace std;
debugC::debugC(machine *BFM){
localMachine = BFM;
}
//entry into debugger
void debugC::start(){
void * v = NULL;
initscr();
raw();
noecho();
}
g ++返回的错误:
/usr/bin/ld: /tmp/cci6mA0L.o: undefined reference to symbol 'raw'
/usr/lib/libtinfo.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
为了清晰起见,我已将其删除为最低功能代码。它在没有调用raw()的情况下编译。
curses.h显然已包含在内,并且在编译时我已将其与之链接。怎么能不理解对某些curses函数的引用,而不是其他函数?
我已经搜索了SO和谷歌寻求帮助,但我似乎无法找到解决方案,我真的很感激任何可能的洞察力。感谢。
答案 0 :(得分:1)
有些系统将ncurses配置为两个库: ncurses (或 ncursesw ),它是高级库, tinfo (或< em> tinfow )这是低级库。 raw
是一个低级功能。
大多数系统提供包/配置脚本(例如ncursesw6-config
或pkg-config
的数据文件),--libs
选项在以这种方式构建时列出两个库:
$ ncursesw6-config --libs
-lncursesw6 -ltinfow6
$ pkg-config --libs ncursesw6
-lncursesw6 -ltinfow6
例如,假设已正确安装pkg-config
,您可以执行以下操作:
g++ debugC.cpp $(pkg-config --libs ncurses)
在某些配置中(例如使用 rpath 功能),依赖库名称存储在共享库中,因此所有需要做的就是引用顶级库来获取都。 Debian(以及Ubuntu等衍生系统)不使用 rpath ,同时也将ncurses配置为两个库。
顺便说一下,提供了两种配置方法(但取决于打包器......):
ncurses*-config
脚本早于pkg-config
,并且有效(尽管有些人对交叉编译工具的命名约定感到困惑),而pkg-config
标准化存在问题(单平台开发人员没有注意到这一点)。