我是Makefiles的新手,我正在尝试在我正在开始的项目中构建我的第一个。
我遇到的问题是让它自动知道如何处理我的所有.cpp文件而不为每个文件定义规则。
我还希望将我的目标文件放在一个文件夹中,在这种情况下$(PLATFORM)/obj
/ PLATFORM=win32
。
以下是我正在使用的Makefile,用mingw32-make.exe执行它
CXX=g++
CXXFLAGS=-c -Wall -DALLEGRO_STATICLINK
LDFLAGS=
PLATFORM=win32
SOURCES=main.cpp
EXECUTABLE=app.exe
OBJDIR=$(PLATFORM)/obj/
OBJECTS= $(SOURCES:%.cpp=$(OBJDIR)%.o)
all: $(EXECUTABLE)
%.o: %.c
$(CXX) $(CXXFLAGS) $< -o $@
$(EXECUTABLE): $(OBJECTS)
$(CXX) $(OBJECTS) $(LDFLAGS) -o $(EXECUTABLE)
我收到了错误:
mingw32-make: * 没有规则来制作目标
win32/obj/main.o', needed by
app.exe'。停止。
我不确定我做错了什么,我一直在寻找其他makefile的例子,他们似乎有类似的结构,所以我不确定我的错。我正在寻找解释为什么会发生这种情况的解释,以及如何解决这个问题的建议 此外,对我的风格的任何评论,使其更清洁/标准化的建议也将是伟大的。在学习制作文件时,我想确保我正确学习。
由于
答案 0 :(得分:0)
make
看到它需要创建win32/obj/main.o
,但看不到任何规则告诉它如何做到这一点。
您有三个规则,一个用于all
,一个用于%.o
,一个用于$(EXECUTABLE)
。第一个和最后一个不会告诉make
如何创建win32/obj/main.o
。
第二条规则可能应该,但它说:如果你想创建<something>.o
,那么首先要确保有一个名为<something>.c
的文件(如果它不存在,请尝试查找制定它的规则)。然后运行以下命令:$(CXX) ...
但文件<something>.c
不存在,因为您的文件以.cpp
结尾。所以这个规则失败了。 make
找不到任何其他规则来构建win32/obj/main.o
,因此它放弃了。
总之,您需要更改规则,以便%.o
依赖于%.cpp
,然后make
将能够运行命令来创建目标文件。所以规则应该是:
%.o: %.cpp
$(CXX) $(CXXFLAGS) $< -o $@
顺便说一句,make
也有预定义的隐式规则。因为您为%.o
提供了明确的规则,所以您实际上会覆盖预定义的规则。我建议你在某些时候尝试不要给出这个规则(但仍然定义CXX
和CXXFLAGS
)并看看会发生什么。有关详细信息,请参阅this。
答案 1 :(得分:-1)
我不想阻止您使用手动makefile,但如果您想完全消除这个问题,可以使用autotools为您生成makefile。由于您使用的是Windows,我怀疑您使用的是cygwin(或者也许是MingGW)。对于cygwin,只需下载autotools二进制包。如果您正在为您的IDE使用eclipse(我强烈推荐),您可以配置您的环境以获取自动工具。这样,您只需专注于编写代码。所有可配置选项仍然存在,但您不必知道make。