对“initscr'”的未定义引用;课程

对“initscr'”的未定义引用;课程,c,compilation,linker,ncurses,undefined-reference,C,Compilation,Linker,Ncurses,Undefined Reference,我正在尝试编译我的项目,我使用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-d

我正在尝试编译我的项目,我使用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,以便在gcc命令行上的目标代码之后出现
-lncurses
指令,即它需要生成以下命令:

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)
-图书馆

链接时搜索名为library的库。(将库作为单独参数的第二个备选方案仅适用于POSIX 合规性,不建议使用。)

在命令中写入此选项的位置会有所不同;链接器搜索和处理库和对象文件 按照指定的顺序。因此,foo.o-lzbar.o搜索 库z在foo.o文件之后,但是 在酒吧前。如果bar.o引用z中的函数,则可能不会加载这些函数


在C++中,我通过链接NCURESS库来修复它。 命令如下:


可能的副本。还有很多很多……你很难明白,
-l
不是一个标志,而是一个指令;)请注意,这表明显示“Makefile中的标志”是不够的,因为您的问题实际上没有显示问题。一位专家不得不凭经验来直觉。你如何用Makefile做到这一点?@CpILL:如果你有新问题,请点击按钮提问。如果有助于提供上下文,请包含指向此问题的链接。使用gcc编译时,-lncurses标志也解决了我的问题。
man gcc | grep -A10 "\-l library"
g++ main.cpp -lncurses