链接 libncurses++ 和 libncurses 的问题
Problems linking libncurses++ and libncurses
我刚刚从源安装了 ncurses
,Makefile 日志显示一切正常。 libncurses.a
和 libncurses++.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;
}
with 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
的问题?我该如何进一步调查并解决链接问题?
TL;DR
官方 C++ 界面实际上可能需要您 link 使用所有 ncurses 额外库,即菜单、面板和表单。以下解决了问题:
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++
取决于那些(不确定是否所有这些,但我不会试图找出答案)。
我刚刚从源安装了 ncurses
,Makefile 日志显示一切正常。 libncurses.a
和 libncurses++.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;
}
with 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
的问题?我该如何进一步调查并解决链接问题?
TL;DR
官方 C++ 界面实际上可能需要您 link 使用所有 ncurses 额外库,即菜单、面板和表单。以下解决了问题:
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++
取决于那些(不确定是否所有这些,但我不会试图找出答案)。