Компиляция кода ncurses с флагом gcc -lncurses, похоже, не работает

Я пишу основанную на терминале игру Tetris, используя ncurses. Я выделил весь код ncurses в файл с именем tetrisUI.c, для которого я включил заголовочный файл в свой исходный файл main.c. Когда я компилирую все функции ncurses, возникают ошибки компилятора. Я включил ncurses.h в свой исходный файл и использую флаг -lncurses в gcc. Я компилирую из make-файла со следующим содержимым:

Tetris : tetris.o main.o tetrisUI.o
gcc tetris.o main.o tetrisUI.o -o Tetris

tetrisUI.o : tetrisUI.c
gcc -std=c99 -c tetrisUI.c -lncurses

tetris.o : tetris.c tetris.h
gcc -std=c99 -c tetris.c

main.o : main.c tetris.h tetrisUI.h
gcc -std=c99 -c main.c

Я смог скомпилировать несколько коротких тестовых программ, используя ncurses просто отлично. Это моя первая попытка использования ncurses и моей первой значимой программы на c (я немного изучил c ++ в школе). У меня есть предчувствие, что моя проблема как-то связана с моим make-файлом, но я новичок в их использовании.

3

Решение

использование -lncurses на этапе ссылки, а не на этапе компиляции:

gcc tetris.o main.o tetrisUI.o -o Tetris -lncurses
3

Другие решения

Вы можете упростить ваш Makefile, используя макросы и правила по умолчанию:

CC     = gcc        # C compiler name
CFLAGS = -std=c99   # C compiler flags

Tetris : tetris.o main.o tetrisUI.o
$(CC) $(CFLAGS) -o $@ $^ -lncurses

tetrisUI.o : tetrisUI.c  tetrisUI.h # make does a "$(CC) $(CFLAGS) -o $@ $<" on its own

tetris.o : tetris.c tetris.h

main.o : main.c tetris.h tetrisUI.h

Немного объяснения: $@ что бы ни строили, $< это первая зависимость, $^ это все из них. Разумное использование этого позволяет уменьшить количество ошибок при вводе (и меньше идиотских ошибок, когда вы добавляете зависимость, а не обрабатываете ее, или пропускаете зависимость (и, следовательно, не повторяете сборку, если она изменяется)). Посмотрите руководство по сборке, если у вас есть GNU make, его информационный файл содержит множество подробных примеров и советов.

1

По вопросам рекламы [email protected]