Undefined reference to `initscr' Ncurses
j'essaie de compiler mon projet et j'utilise la lib ncurse. Et j'ai quelques erreurs quand le compilateur lie des fichiers.
voici ma ligne de drapeaux dans Makefile:
-W -Wall -Werror -Wextra -lncurses
j'ai inclus les cours.h
Certaines mises en page :
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
Et voici mes erreurs :
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
Merci beaucoup
4 réponses
vous devez changer votre makefile pour que le -lncurses
directive après votre code objet sur la ligne de commande gcc, c'est-à-dire qu'il doit générer la commande:
gcc -W -Wall -Werror -Wextra -I./Includes/. -o Sources/NCurses/ncurses_init.o -c Sources/NCurses/ncurses_init.c -lncurses
ceci est dû au fait que les fichiers objets et les bibliothèques sont reliés par ordre en un seul passage.
j'ai des options pour corriger l'ordre en utilisant la variable LDLIBS:
ifndef PKG_CONFIG
PKG_CONFIG=pkg-config
endif
CFLAGS+=-std=c99 -pedantic -Wall
LDLIBS=$(shell $(PKG_CONFIG) --libs ncurses)
En C++ , j'ai corrigé simplement en reliant la bibliothèque ncurses .
Voici la commande :
g++ main.cpp -lncurses
man gcc | grep -A10 "\-l library"
-l de la bibliothèque
rechercher la bibliothèque nommée bibliothèque lors du lien. (La seconde alternative avec la bibliothèque comme argument séparé est seulement pour POSIX conformité et n'est pas recommandé.)
Cela fait une différence où dans la commande vous écrivez cette option; le linker recherche et traite les bibliothèques et les fichiers d'objets dans l'ordre où elles sont indiquées. Ainsi, foo.o-lz bar.o recherches bibliothèque z après file foo.o mais avant bar.o. Si la barre.o se réfère aux fonctions en z, ces fonctions ne peuvent pas être chargées.