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

标签 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 和 Google 寻求帮助,但我似乎找不到解决方案,我非常感谢任何可能的见解。谢谢。

最佳答案

一些系统将 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 存在标准化问题(未被单平台开发人员注意到)。

关于c++ - G++ 无法找到对 raw() 或 cbreak() 的引用,即使在链接 curses 时也是如此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47047411/

相关文章:

c++ - 我究竟应该如何为数组实现随机数或随机数算法以随机顺序显示引号?

c++ - g++, R_X86_64_32S : what is it?

linux - 如何理解 "/proc/[pid]/stack"?

编译期间gcc字符串表溢出错误

c++ - #define函数的多重定义

c++ - QRegularExpression 源字符串中的匹配位置

c++ - 使用 C++ 和 CryptoApi/SChannel 从 SChannel 中提取证书链

c++ - 转换一个值为 255 的 char 会导致 unsigned int 值为 4294967295,这是什么原因?

linux - 尝试使 shell 脚本可执行时出错

c - 使用 strcpy() 时出现段错误?