Undefined reference to 'Initscr' Ncurses

Próbuję skompilować mój projekt i używam lib ncurse. I mam kilka błędów, gdy kompilator łączy pliki.

Oto moja linia flags w Makefile:

-W -Wall -Werror -Wextra -lncurses
Włączyłem ncurses.h

Niektóre layouty:

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

A oto moje erro:

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

Wielkie dzięki

Author: BoilingLime, 2013-04-24

4 answers

Musisz zmienić plik makefile tak, aby dyrektywa -lncurses pojawiła się Po Twoim kodzie obiektowym w linii poleceń gcc, tzn. musi wygenerować polecenie:

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

Dzieje się tak, ponieważ pliki obiektowe i biblioteki są połączone w kolejności w jednym przejściu.

 35
Author: Paul R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-24 12:31:38

W C++ , naprawiłem to poprzez połączenie biblioteki ncurses .

Oto polecenie:

g++ main.cpp -lncurses
 4
Author: Natesh bhat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-09 23:44:04

Mam flagi do poprawienia kolejności używając zmiennej LDLIBS:

ifndef PKG_CONFIG
PKG_CONFIG=pkg-config
endif

CFLAGS+=-std=c99 -pedantic -Wall
LDLIBS=$(shell $(PKG_CONFIG) --libs ncurses)
 2
Author: Ari Malinen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-05 15:17:33
man gcc | grep -A10 "\-l library"

- biblioteka l

Przeszukaj bibliotekę o nazwie library podczas łączenia. (Druga alternatywa z biblioteką jako osobnym argumentem jest tylko dla POSIX zgodność i nie jest zalecane.)

Robi różnicę, gdzie w poleceniu zapisujesz tę opcję; linker wyszukuje i przetwarza biblioteki i pliki obiektowe w określonej kolejności. Tak więc, foo.Bar o-lz.o szukanie biblioteka z PO pliku foo.o ale przed barem.o. Jeśli bar.o odnosi się do funkcji w z, funkcje te mogą nie być ładowane.

 -1
Author: mihai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-19 08:58:10