对`initscr`的引用未定义 Ncurses

26

我正在尝试编译我的项目,并使用了ncurse库。但是当编译器链接文件时,我遇到了一些错误。

这是我的Makefile中的flags行:

-W -Wall -Werror -Wextra -lncurses

我已经包含了ncurses.h

一些布局:

prompt$> dpkg -S curses.h
libslang2-dev:amd64: /usr/include/slcurses.h
libncurses5-dev: /usr/include/ncurses.h
libncurses5-dev: /usr/include/curses.h

prompt$> dpkg -L libncurses5-dev | grep .so
/usr/lib/x86_64-linux-gnu/libncurses.so
/usr/lib/x86_64-linux-gnu/libcurses.so
/usr/lib/x86_64-linux-gnu/libmenu.so
/usr/lib/x86_64-linux-gnu/libform.so
/usr/lib/x86_64-linux-gnu/libpanel.s

这里是我的错误:

gcc -W -Wall -Werror -Wextra -I./Includes/. -lncurses -o Sources/NCurses/ncurses_init.o -c Sources/NCurses/ncurses_init.c
./Sources/NCurses/ncurses_init.o: In function `ncruses_destroy':
ncurses_init.c:(.text+0x5): undefined reference to `endwin'
./Sources/NCurses/ncurses_init.o: In function `ncurses_write_line':
ncurses_init.c:(.text+0xc5): undefined reference to `mvwprintw'
./Sources/NCurses/ncurses_init.o: In function `ncurses_init':
ncurses_init.c:(.text+0xee): undefined reference to `initscr'
collect2: error: ld returned 1 exit status

非常感谢


2
可能重复:GCC:使用OpenSSL的SHA256函数。以及许多,许多更多... - Some programmer dude
你会通过痛苦的方式学习到-l<lib>不是一个flag,而是一个directive。;) - MestreLion
4个回答

44

你需要更改 makefile 文件,以便在 gcc 命令行中将 -lncurses 指令放在对象代码之后,即需要生成以下命令:

gcc -W -Wall -Werror -Wextra -I./Includes/. -o Sources/NCurses/ncurses_init.o -c Sources/NCurses/ncurses_init.c -lncurses

这是因为目标文件和库在单次链接中按顺序链接。


3
注意,这表明在Makefile中展示“flags”的方法是不足的,因为您的问题实际上并未展示问题。专家必须从经验中直觉到它。 - Lightness Races in Orbit
你如何使用Makefile来完成这个任务? - CpILL
@CpILL:如果您有新的问题,请通过单击提问按钮来提出。如果有必要,可以包含此问题的链接以提供上下文。 - Paul R

6
在 C++ 中,我只需链接 ncurses 库就可以解决问题。

以下是命令:

g++ main.cpp -lncurses

2
使用 -lncurses 标志在使用 gcc 编译时也解决了我的问题。 - Chris

2
我使用LDLIBS变量对标志进行了正确的排序:
ifndef PKG_CONFIG
PKG_CONFIG=pkg-config
endif

CFLAGS+=-std=c99 -pedantic -Wall
LDLIBS=$(shell $(PKG_CONFIG) --libs ncurses)

0
man gcc | grep -A10 "\-l library"

-l library
在链接时搜索名为library的库。(将库作为单独参数的第二个替代方案仅用于POSIX兼容性,不建议使用。)
选项在命令中的位置很重要; 链接器按照它们被指定的顺序搜索和处理库和目标文件。 因此,foo.o -lz bar.o在搜索文件foo.o之后但在bar.o之前搜索库z。 如果bar.o引用z中的函数,则可能无法加载这些函数。

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