我正在尝试创建一个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...)
的原因。
您有几个问题。最重要的是这里:
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)
这样的翻译不会返回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
文件的同上。