c++ 使用libncurses进行编译链接失败,并出现“undefined reference”

yhqotfr8  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(163)

我刚刚从源代码安装了ncurses,Makefile日志使它看起来一切正常。libncurses.alibncurses++.a都存在,使用-lncurses-lncurses++不会引发“cannot found -lX”错误。

$ ls -al /usr/lib/x86_64-linux-gnu/*curses*
lrwxrwxrwx 1 root root     12 Feb 19  2016 /usr/lib/x86_64-linux-gnu/libcurses.a -> libncurses.a
lrwxrwxrwx 1 root root     13 Feb 19  2016 /usr/lib/x86_64-linux-gnu/libcurses.so -> libncurses.so
-rw-r--r-- 1 root root 298812 Feb 19  2016 /usr/lib/x86_64-linux-gnu/libncurses.a
-rw-r--r-- 1 root root 171456 Feb 19  2016 /usr/lib/x86_64-linux-gnu/libncurses++.a
-rw-r--r-- 1 root root     31 Feb 19  2016 /usr/lib/x86_64-linux-gnu/libncurses.so

奇怪的是,当试图编译一个类似

#include <cursesapp.h>
#include <cursesm.h>
#include <cursesf.h>

int main() {
    NCursesPanel *mystd = new NCursesPanel();

    return 0;
}

使用g++ src/main.cpp -o main -lncurses++将抛出一个非常长的libcurses++内部链接错误列表。链接一个额外的-lncurses也不会有帮助。一小段摘录:

/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libncurses++.a(cursesw.o): In function `NCursesWindow::initialize() [clone .part.11]':
(.text+0xd0): undefined reference to `noecho'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libncurses++.a(cursesw.o): In function `NCursesWindow::scanw(char const*, ...)':
(.text+0x214): undefined reference to `vwscanw'

我发现错误消息指向/usr/lib/gcc/5很奇怪,我想也许我的机器上有两个libncurses,但我找不到它。
我的机器上真的有多个ncurses的问题吗?如何进一步调查并解决链接问题?

oalqel3c

oalqel3c1#

TL;DR

官方的C++接口实际上可能要求您链接所有ncurses额外的库,即Menu,Panel和Forms。以下解决了问题:
g++ file.cpp -lncurses++ -lmenu -lpanel -lform -lutil -lncurses

关注Demo

查看c++代码online,我意识到它附带了一个demo.cc,并检查了make进程,很明显演示程序已经编译好了。因为安装进行得很顺利,我知道构建过程能够编译,所以我也应该编译。
make中发出的完整命令是:
g++ -o demo ../objects/demo.o -L../lib -lncurses++ -L../lib -lform -lmenu -lpanel -lncurses -lutil -DHAVE_CONFIG_H -I../c++ -I. -I../include -D_GNU_SOURCE -D_DEFAULT_SOURCE -DNDEBUG -O2
因此,在用实际的源文件替换对象之后,我开始删除标志和参数,直到它破坏编译。结果是libcurses++依赖于这些。

相关问题