Использование GNU Make для компиляции несуществующих объектных файлов - PullRequest
0 голосов
/ 12 февраля 2020

Я изучаю C ++ уже несколько месяцев, просто используя редактор и мой терминал для компиляции и запуска моих программ. Но я увидел необходимость быть более формальным с моими проектами, поэтому я пытаюсь научиться создавать правильную структуру файлов проекта, а также как использовать Make.

В настоящее время я использую GNU Make 4.1. Но у меня возникают проблемы с созданием объектных файлов с помощью Make, получая сообщение об ошибке:

make: *** No rule to make target 'build/%.o', needed by 'main'.  Stop.

Я искал решение, но пока что ни один не помог.

Здесь мой make-файл:

# Specify compiler
CC=gcc

# Specify linker
LINK=gcc

# Specify flags
CPPFLAGS = -Wall -g

# Specify directories
SRCDIR = ./src
OBJDIR = ./build

# Compile object files
$(OBJDIR)/%.o : $(SRCDIR)/%.cpp
    $(CC) -c -o $@ $< $(CPPFLAGS)

# Compile object files into binary
main : $(OBJDIR)/%.o
    $(CC) -o $@ $^

1 Ответ

1 голос
/ 12 февраля 2020

Рассмотрим последнее правило ...

# Compile object files into binary
main : $(OBJDIR)/%.o
    $(CC) -o $@ $^

К сожалению, $(OBJDIR)/%.o не раскрывается так, как вам нужно. Предполагая, что все ваши исходные файлы находятся в $(SRCDIR), вы можете создать переменную, содержащую их имена ...

SRCFILES := $(wildcard $(SRCDIR)/*.cpp)

Теперь создайте переменную, содержащую соответствующие пути к объектным файлам ...

OBJFILES := $(patsubst $(SRCDIR)/%.cpp,$(OBJDIR)/%.o,$(SRCFILES))

Теперь $(OBJFILES) должен содержать список путей к объектным файлам, от которых зависит main. Таким образом, окончательное правило становится ...

main: $(OBJFILES)
    $(CC) -o $@ $^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...