В настоящее время я пытаюсь создать Makefile для проекта университета C, но чтение руководств мне не очень помогло (к тому же makefile не является частью процесса оценки, и нас не учат, как это делать)
Моя цель — сделать 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/ на bin/. Я пытался заменить '=' на ':=', но результат тот же, и я не совсем понимаю, в чем разница между ними. Моя идея заключалась бы в том, чтобы, например, src/main.c превратился в bin/main.o.
%.o: %.c
$(COMPILER) $(FLAGS) -c %< -o %@
Эта часть также является моей неудачной попыткой сгенерировать все объектные файлы по отдельности с одной целью. Я пытался читать об этом, но не мог понять, как они работают: '%‹', '%@' или '%.o' и '%.c'.
Я действительно считаю, что он вообще не запускается, так как никаких объектных файлов не появилось.
Я надеюсь, что вы можете помочь мне исправить этот беспорядок, спасибо заранее!