Undefined ссылка на "initscr" Ncurses
Я пытаюсь скомпилировать свой проект, и я использую lib ncurse. И у меня есть некоторые ошибки, когда файлы ссылок компилятора.
Вот моя строка flags в 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
Спасибо большое
Ответы
Ответ 1
Вам необходимо изменить свой файл makefile, чтобы директива -lncurses
появилась после вашего объектного кода в командной строке gcc, т.е. ему нужно сгенерировать команду:
gcc -W -Wall -Werror -Wextra -I./Includes/. -o Sources/NCurses/ncurses_init.o -c Sources/NCurses/ncurses_init.c -lncurses
Это связано с тем, что объектные файлы и библиотеки связаны по порядку за один проход.
Ответ 2
В С++ я исправил его, просто связав библиотеку ncurses.
Вот команда:
g++ main.cpp -lncurses
Ответ 3
У меня есть флаги для правильного порядка с использованием переменной LDLIBS:
ifndef PKG_CONFIG
PKG_CONFIG=pkg-config
endif
CFLAGS+=-std=c99 -pedantic -Wall
LDLIBS=$(shell $(PKG_CONFIG) --libs ncurses)
Ответ 4
man gcc | grep -A10 "\-l library"
-l библиотека
Ищите библиотеку с именем library при связывании. (Вторая альтернатива с библиотекой в качестве отдельного аргумента предназначена только для POSIX и не рекомендуется.)
Это имеет значение, когда в команде вы пишете эту опцию; компоновщик ищет и обрабатывает библиотеки и объектные файлы в том порядке, в котором они указаны. Таким образом, foo.o -lz bar.o search библиотека z после файла foo.o, но перед баром. Если bar.o ссылается на функции из z, эти функции могут не загружаться.