Неопределенная ссылка на `initscr 'Ncurses

Я пытаюсь скомпилировать свой проект и использую lib ncurse. И у меня есть некоторые ошибки, когда компилятор связывает файлы.

Вот моя строка флагов в Makefile:

-W -Wall -Werror -Wextra -lncurses

Я включил ncurses.h

Некоторые макеты:

prompt
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
gt; dpkg -S curses.h libslang2-dev:amd64: /usr/include/slcurses.h libncurses5-dev: /usr/include/ncurses.h libncurses5-dev: /usr/include/curses.h prompt
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
gt; 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

большое спасибо

 MestreLion23 февр. 2015 г., 07:30
И вы изучаете трудный путь, который-l<lib> это нефлаг, а скореедиректива ;)
 Some programmer dude24 апр. 2013 г., 14:31
возможный дубликатGCC: использовать функции OpenSSL SHA256, И многое, многое другое ...

Ответы на вопрос(4)

man gcc | grep -A10 "\-l library"

Поиск библиотеки по имени библиотеки при связывании. (Второй вариант с библиотекой в качестве отдельного аргумента предназначен только для соответствия POSIX и не рекомендуется.)

Имеет значение, где в команде вы пишете эту опцию; компоновщик ищет и обрабатывает библиотеки и объектные файлы в указанном порядке. Таким образом, foo.o -lz bar.o ищет библиотеку z после файла foo.o, но до bar.o. Если bar.o ссылается на функции в z, эти функции могут быть не загружены.

ifndef PKG_CONFIG
PKG_CONFIG=pkg-config
endif

CFLAGS+=-std=c99 -pedantic -Wall
LDLIBS=$(shell $(PKG_CONFIG) --libs ncurses)
Решение Вопроса

чтобы-lncurses директива приходитпосле Ваш объектный код в командной строке gcc, т.е. он должен сгенерировать команду:

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

Это потому, что объектные файлы и библиотеки связаны по порядку за один проход.

 BoilingLime24 апр. 2013 г., 14:37
Это была проблема, большое спасибо.
 Lightness Races in Orbit05 сент. 2014 г., 17:23
Обратите внимание, что это демонстрирует, что ваши «флаги в Makefile» были недостаточны, так как ваш вопрос фактически не показывает проблему. Эксперт должен был интуитивно понять это.

Вот команда:

g++ main.cpp -lncurses
 Chris29 сент. 2018 г., 01:58
Флаг -lncurses также решил мою проблему при компиляции с gcc.

Ваш ответ на вопрос