即使链接curses

时间:2017-11-01 02:40:15

标签: c++ linux g++ ncurses curses

我很难完成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和谷歌寻求帮助,但我似乎无法找到解决方案,我真的很感激任何可能的洞察力。感谢。

1 个答案:

答案 0 :(得分:1)

有些系统将ncurses配置为两个库: ncurses (或 ncursesw ),它是高级库, tinfo (或< em> tinfow )这是低级库。 raw 是一个低级功能。

大多数系统提供包/配置脚本(例如ncursesw6-configpkg-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标准化存在问题(单平台开发人员没有注意到这一点)。