搜索所有.c和.cpp文件并将它们编译为一个makefile

问题描述 投票:0回答:1

我正在尝试创建一个makefile,它将找到所有现有的.c和.cpp文件,然后对其进行编译。

我已经使用How to place object files in separate subdirectory作为模板并将其与How to make a makefile for C and C++, with sources in subdirectories结合在一起。假设我已经定义了所有变量(由于它们是不必要的,所以我将它们省略了)。

我一直收到的错误是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...)的原因。

c++ c makefile
1个回答
0
投票

您有几个问题。最重要的是这里:

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))

它将(假设BUILDDIRobj):

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)这样的翻译不会返回only匹配模式的单词...所以它返回ALL单词,而translates仅返回匹配模式的单词。] >

由于您只是将.o添加到后缀而不是替换后缀,因此可以简化为:

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

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

此规则也不正确:

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

这里您尚未声明任何先决条件。也许您在其他未向我们展示的地方这样做,但最好是这样:

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

当然也是.cpp文件的同上。

© www.soinside.com 2019 - 2024. All rights reserved.