Компиляция всех файлов C и создание исполняемого файла с Makefile - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть проект C, который имеет следующую файловую структуру:

Makefile
src
 |-utils
 |   |--vic.c
 |   |--vic.h
 |-mod
 |  |--type.c
 |  |--type.h
 |-bb.c
 |-bb.h
 |-main.c

Итак, в корневом каталоге у меня есть фактический Makefile и каталог src, который включает в себя исходные файлы. Внутри каталога src есть несколько файлов .c и .h вместе с файлом main.c, а также есть другие каталоги, которые также содержат другие файлы .c и .h. Обратите внимание, что приведенная выше файловая структура сокращена для краткости. Я хочу создать Makefile, который будет автоматически компилировать все и генерировать исполняемую программу main, а также удалять объектные файлы, сгенерированные во время компиляции. В настоящее время у меня есть что-то вроде этого:

CC=gcc
CFLAGS=
RM=rm -rf
OUT=main
SRC=src
OBJ=obj

SOURCES=$(wildcard $(SRC)/*.c)
OBJECTS=$(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES))

all: build

build: $(OBJECTS)
    $(CC) $(CFLAGS) $^ -o $@
    $(RM) $(OBJ)

$(OBJ)/%.o: $(SRC)/%.c
    $(CC) $(CFLAGS) -I$(SRC) -c $< -o $@

debug: CFLAGS+=-DDEBUG
debug: build

.PHONY: clean

clean:
    $(RM) $(OBJ) $(OUT)

Но, похоже, это работает не так, как ожидалось, так как когда я выполняю команду make, она возвращает следующее сообщение об ошибке:

Сообщения ассемблера: неустранимая ошибка: невозможно создать obj / main.o: такого файла нет или каталог

Есть идеи, как добиться того, чего я хочу?

1 Ответ

0 голосов
/ 07 сентября 2018

Кажется, вы rm -rf obj/ после каждого шага, но нет mkdir -p obj/ для его замены.

Поскольку GNU make сама удалит промежуточные цели, я не понимаю, почему вы бы это сделалисделайте $(RM) $(OBJ), но ваша цель %.o может иметь строку типа mkdir -p "$(shell dirname "$@")"…, чтобы убедиться, что каталог назначения существует.

PS: ваш вывод называется build, а не main, потому что этоимя, которое вы дали ему ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...