编译链接 libncurses 时出现“未定义的引用”错误。

3
我刚刚从源代码安装了ncurses,Makefile日志显示一切都很正常。两个文件libncurses.alibncurses++.a都存在,并且使用-lncurses-lncurses++不会引发“无法找到-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 的问题吗?我该如何进一步调查并解决链接问题?

你尝试过按照这个顺序运行命令吗:g++ src/main.cpp -o main -lncurses++ -lncurses - Jean-François Fabre
@Jean-FrançoisFabre 是的,结果与之前使用“-lncurses”或者不使用它是一样的。 - villasv
我不知道为什么被踩了,有没有办法改进这个问题? - villasv
看起来你把踩的赞反转了!干得好。 - Jean-François Fabre
1个回答

3

简而言之

官方的 C++ 接口可能需要链接所有 ncurses 的额外库,即 Menu、Panel 和 Forms。以下是解决方法:

g++ file.cpp -lncurses++ -lmenu -lpanel -lform -lutil -lncurses

跟随演示

查看 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++ 依赖于它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接