Я пишу основанную на терминале игру 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-файлом, но я новичок в их использовании.
использование -lncurses
на этапе ссылки, а не на этапе компиляции:
gcc tetris.o main.o tetrisUI.o -o Tetris -lncurses
Вы можете упростить ваш 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, его информационный файл содержит множество подробных примеров и советов.