Поиск всех. c и. cpp файлов и сборка их в один make-файл - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь создать make-файл, который найдет все существующие файлы. c и. cpp, а затем скомпилирует их.

Я использовал Как поместить объектные файлы в отдельный подкаталог как шаблон и объединить его с Как создать make-файл для C и C ++, с исходниками в подкаталогах . Предположим, что я определил все переменные (я просто пропустил их, так как они не нужны).

Ошибка, которую я продолжаю получать: make: *** No rule to make target 'obj/<randoCfile>.c', needed by '<target>'. Stop.

SOURCES := $(call rwildcard,$(SRCDIR),*.c)
SOURCES += $(call rwildcard,$(SRCDIR),*.cpp)
OBJECTS     := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:%.c=%.c.o))
OBJECTS     += $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:%.cpp=%.cpp.o))

#Default Make
all: $(TARGET)

#Remake
remake: cleaner all

#Make the Directories
directories:
    @mkdir -p $(TARGETDIR)
    @mkdir -p $(BUILDDIR)

#Clean only Objecst
clean:
    @$(RM) -rf $(BUILDDIR)

#Full Clean, Objects and Binaries
cleaner: clean
    @$(RM) -rf $(TARGETDIR)

#Link
$(TARGET): $(OBJECTS)
    $(CC) -o $(TARGETDIR)/$(TARGET) $^ $(LIB)

$(BUILDDIR)/%.c.o:
    $(CC) $(INC) $(CFLAGS) -c -o $@ $<

$(BUILDDIR)/%.cpp.o:
    $(CXX) $(INC) $(CXXFLAGS) -c -o $@ $<

#Non-File Targets
.PHONY: all remake clean cleaner resources

Любые предложения относительно того, как исправить моя проблема? Я работаю на Windows (именно поэтому я использую подстановочный знак, а не shell(find...), который был в одном из примеров, которые я нашел.

Ответы [ 2 ]

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

У вас есть пара проблем. Самое важное здесь:

SOURCES := $(call rwildcard,$(SRCDIR),*.c)
SOURCES += $(call rwildcard,$(SRCDIR),*.cpp)

Предположим, что это приводит к следующему значению для SOURCES:

SOURCES := src/foo.c src/bar/bar.c src/biz/biz.cpp src/boz.cpp

Теперь, что будет OBJECTS после следующего?

OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:%.c=%.c.o))
OBJECTS += $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:%.cpp=%.cpp.o))

Это будет (при условии BUILDDIR это obj):

OBJECTS := obj/foo.c.o obj/bar/bar.c.o obj/biz/biz.cpp obj/boz.cpp \
           obj/foo.c obj/bar/bar.c obj/biz/biz.cpp.o obj/boz.cpp.o

Почему? Поскольку перевод, подобный $(SOURCES:%.c=%.c.o), не возвращает только слов, соответствующих шаблону ... он возвращает ALL слов, а переводит только тех которые соответствуют шаблону.

Поскольку вы просто добавляете .o к суффиксу, а не заменяете суффикс, вы можете упростить это как:

SOURCES := $(call rwildcard,$(SRCDIR),*.c)
SOURCES += $(call rwildcard,$(SRCDIR),*.cpp)

OBJECTS := $(SOURCES:$(SRCDIR)/%=$(BUILDDIR)/%.o))

Также это правило не right:

$(BUILDDIR)/%.c.o:
        $(CC) $(INC) $(CFLAGS) -c -o $@ $<

Здесь вы не заявили никаких предварительных условий. Может быть, вы делаете это где-то еще, что вы не показали нам, но лучше было бы вместо этого:

$(BUILDDIR)/%.c.o: $(SRCDIR)/%.c
        $(CC) $(INC) $(CFLAGS) -c -o $@ $<

И конечно же, для файлов .cpp.

0 голосов
/ 21 февраля 2020

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

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

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