【发布时间】:2020-02-20 22:48:37
【问题描述】:
我正在尝试创建一个 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...)。
【问题讨论】:
-
你不能。您必须列出要编译的每个源文件。
-
你不能按照你的要求去做,因为 make 文件不能使用通配符。花几分钟时间创建一个合适的 makefile - 你可能已经完成了它并在你创建这篇文章所花费的时间内工作。
-
查看您的规则,您似乎正在为每个源文件制作单独的可执行文件,而不是从所有源文件制作单个可执行文件。如果是这种情况,最简单的解决方案可能是删除 Makefile 并让 make 对所有内容使用默认规则。例如,
rm Makefile; make $(basename *.c *.cc | sed 's/\..*$//')之类的东西应该没问题。它不会将目标文件放在不同的目录中,但它很简单。使用默认规则;他们的存在是为了提供帮助。 -
真的不清楚你现在的情况。请清楚地说明您拥有哪些文件(以及当前的项目层次结构)以及您希望从这些文件中生成哪些文件。另外,说明你打算如何从命令行调用
make。 -
听起来
cmake更有可能更轻松地解决您的任务,您仍然需要生成一个源文件列表。您是否考虑过安装 cygwin 以便拥有像find这样的 linux 工具?