В настоящее время я пытаюсь создать Makefile для проекта AC University, но чтение учебников мне не очень помогло (также makefile не является частью процесса оценки, и нас не учат, как это делать.it)
Моя цель - сделать make-файл автоматическим, поэтому он автоматически создает объектные файлы из .c-файлов в src (src / *. c), помещает объектные файлы в папку bin и связывает их висполняемый файл в главном каталоге.
project/
bin/
(object files)
src/
(source files)
executable
Makefile
Пока что я примерно собрал этот make-файл и тестовый исходный код, но он не работает так, как я намереваюсь, и я объясню, каквпереди:
#compiler used
COMPILER = gcc
#flags for individual object file compilation
FLAGS = -Wall -ansi -g
#RELEASE
# -Wall -ansi -O3
#DEVELOPMENT
# -Wall -ansi -g
#source .c files
SOURCE = $(wildcard src/*.c)
#object files created
OBJECTS = $(SOURCE:.c=.o)
OBJECTS = $(SOURCE: src/=bin/)
#executable name
EXECUTABLE = app
############################################################
all: $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(COMPILER) $(FLAGS) -o $(EXECUTABLE) $(OBJECTS)
%.o: %.c
$(COMPILER) $(FLAGS) -c %< -o %@
В результате получается следующая команда:
user@user-lenovo:~/Desktop/C Projects/AED/project$ make
gcc -Wall -ansi -g -o app src/main.c src/test.c
Как ни странно, это работает, но на самом деле не должно.Это также отрицает необходимость иметь make-файл, так как все компилируется снова, как только обнаруживается одно изменение.
Прежде всего, я заметил, что OBJECTS непосредственно скопировал SOURCE, и не заменил .c на .oили src / для бина /.Я попытался заменить '=' на ': =', но результат тот же, и я не совсем понимаю, в чем разница между ними.Моей идеей было бы, например, src / main.c стать bin / main.o.
%.o: %.c
$(COMPILER) $(FLAGS) -c %< -o %@
Эта часть также является моей неудачной попыткой генерировать все объектные файлы индивидуально с одной целью.Я попытался прочитать об этом, но не мог понять, как это работает: «% <», «% @» или «% .o» и «% .c» </p>
Я верю, что это не такХотя он вообще не запускается, поскольку никаких объектных файлов не обнаружено.
Надеюсь, вы поможете мне исправить это, заранее спасибо!