G++ 找不到对 raw() 或 cbreak() 的引用,即使在链接 curses 时也是如此

G++ can't find references to raw() or cbreak(), even when linking curses

本文关键字:curses 链接 raw 找不到 cbreak G++ 引用      更新时间:2023-10-16

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

一些系统将ncurses配置为两个库:高级库ncursesw(或ncursesw)和低级库tinforaw是一个低级功能。

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