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

G++ can't find references to raw() or cbreak(), even when linking 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 和 Google 寻求帮助,但我似乎找不到解决方案,我真的很感激任何可能的见解。谢谢

一些系统将ncurses配置为两个库:ncurses(或ncursesw)是高级库,tinfo(或tinfow)这是低级库。 raw 是低级特征。

大多数系统提供 package/configuration 脚本(例如,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 存在标准化问题(未被单平台开发人员注意到)。