未定义的引用`initscr’ncurses

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

这是我在Makefile中的标志行:

-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 

非常感谢

您需要更改您的makefile,以便-lncurses指令位于gcc命令行上的目标代码之后 ,即它需要生成命令:

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

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

我通过使用LDLIBS变量得到了正确顺序的标志:

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

在C ++中,我只是通过链接ncurses库来修复它。

这是命令:

 g++ main.cpp -lncurses 
 man gcc | grep -A10 "\-l library" 

-l库

链接时搜索名为library的库。 (将库作为单独参数的第二种方法仅适用于POSIX,不建议使用。)

它在您编写此选项的命令中有所不同; 链接器按照指定的顺序搜索和处理库和目标文件。 因此,foo.o -lz bar.o在文件foo.o之后但在bar.o之前搜索库z。 如果bar.o引用z中的函数,则可能无法加载这些函数。