Makefile не может найти мой файл зависимостей .cpp - PullRequest
0 голосов
/ 24 марта 2019

Файлы makefile.vars Я пытаюсь скомпилировать 4 файла .cpp и заголовок во время выполнения процесса компиляции, чтобы я мог получить объектные файлы и файл сборкино make-файл выдает ошибку, что не может найти мой оригинальный файл .cpp.«Нет правила, чтобы сделать целевой Add.cpp необходимым для Add.s. Stop.»

#include "makefile.vars"
$(Bin)Main: $(Objects)Add.o $(Objects)Subtract.o $(Objects)Multiply.o $(Objects)common.o $(Objects)Main.o
    $(GCC) $(Objects)Add.o
    $(Objects)Subtract.o
    $(Objects)Multiply.o
    $(Objects)common.o
    $(Objects)Main.o
    -o $(Bin)Main
clean:
    rm -rf $(Bin)/* $(Objects)/* $(Pre)/* $(Assembly)/*

$(Assembly)Add.s: $(Source)Add.cpp
    $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -S  -o $(Source)Add.cpp  $(Assembly)Add.s
$(Assembly)Add.o: $(Source)Add.s
    $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -c -o $(Assembly)Add.s $(Objects)Add.o

$(Assembly)Subtract.s: $(Source)Subtract.cpp
    $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -S -o $(Source)Subtract.cpp  $(Assembly)Subtract.s
$(Assembly)Subtract.o: $(Source)Subtract.s
    $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -c -o $(Assembly)Subtract.s $(Objects)Subtract.o

$(Assembly)Multiply.s: $(Source)Multiply.cpp
    $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -S -o $(Source)Multiply.cpp  $(Assembly)Multiply.s
$(Assembly)/Multiply.o: $(Source)/Multiply.s
    $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -c -o $(Assembly)Multiply.s $(Objects)Multiply.o

$(Assembly)Main.s: $(Source)Main.cpp
    $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -S -o $(Source)Main.cpp  $(Assembly)Main.s
$(Assembly)/Main.o: $(Source)/Main.s
    $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -c -o $(Assembly)Main.s  $(Objects)Main.o

$(Assembly)common.s: $(Header)common.h
    $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -S -o $(Header)common.h  $(Assembly)common.s
$(Assembly)common.o: $(Source)common.s
    $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -c -o $(Assembly)common.s $(Objects)common.o

Я хочу, чтобы мои файлы были объектными файлами в конце, которые я могу связать.

1 Ответ

3 голосов
/ 24 марта 2019

Ваша проблема в том, что вы используете препроцессор C / C ++ #include в make-файле.Make-файлы не являются кодом C / C ++.

В make-файле # вводит строку комментария, поэтому остальная часть строки игнорируется.

Кроме того, make не делает ничего особенногос кавычками, поэтому вы не должны использовать их в не-рецептурных частях make-файлов (вы, конечно, должны использовать их там, где это необходимо, в рецептах, которые передаются в оболочку, потому что оболочка делает специальные операции с кавычками).

Изменить:

#include "makefile.vars"

на:

include makefile.vars

ETA

Ваша следующая проблема - неправильное использованиепеременные, поэтому make не может создать цепочку зависимостей.Рассмотрим эти правила:

$(Bin)Main: $(Objects)Add.o ...
        ...
$(Assembly)Add.s: $(Source)Add.cpp
        ...
$(Assembly)Add.o: $(Source)Add.s
        ...

Первое правило говорит, что make может создавать $(Bin)Main из $(Objects)Add.o.Второй говорит, что make может создать $(Assembly)Add.s из $(Source)Add.cpp.Последнее правило говорит, что make может создавать $(Assembly)Add.o из $(Source)Add.s.

Ни одно из этих правил не говорит make, как создавать $(Objects)Add.o (при условии, что переменные Objects и Assembly не имеютто же значение).

И если вы это исправите, то получите ошибку, потому что ни одно из ваших правил не говорит make, как построить $(Source)Add.s, что является обязательным условием Add.o.

Вам нужно использовать одни и те же переменные для одной цели во всех местах;окончательное правило должно быть:

$(Objects)Add.o: $(Assembly)Add.s
        ...

ETA2

Также ваши правила неверны: вы используете -o $(Source)Add.cpp, поэтому вы просите компилятор сгенерировать вывод, который перезапишет ваш исходный файл.Я надеюсь, что вы увидите это редактирование прежде, чем исправите свой make-файл достаточно, чтобы удалить весь ваш код.

ETA3

Ваши make-файлы будут намного проще и на много менее подвержен ошибкам (и намного легче исправлять ошибки), если вы используете шаблонные правила вместо дублирования всего текста снова и снова;удалите ВСЕ ваши правила для сборки сборочных и объектных файлов и добавьте эти два правила шаблона:

(Assembly)%.s: $(Source)%.cpp
        $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -S -o $@ $<
$(Objects)%.o: $(Assembly)%.s
        $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -c -o $@ $<
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...