图案匹配明格

Pattern Matching mingw make

本文关键字:      更新时间:2023-10-16

我对Makefiles非常陌生,目前我正在尝试在我正在启动的项目上构建我的第一个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的例子,它们似乎有类似的结构,所以我不确定自己的错在哪里。我正在寻找为什么会发生这种情况的解释,以及如何解决它的建议。
此外,任何对我的风格的评论,以及使其更加干净/标准化的建议都将非常好。在学习制作makefile的同时,我想确保我的学习是正确的。

感谢

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提供了一个显式规则,所以实际上您正在覆盖预定义的规则。我建议你在某个时候尽量不给出这个规则(但仍然定义CXXCXXFLAGS),看看会发生什么。有关详细信息,请参阅此。

我不想劝阻您使用手动生成文件,但如果您想完全消除这个问题,可以使用自动工具为您生成生成文件。既然你在使用Windows,我怀疑你在使用cygwin(或者MingGW)。对于cygwin,只需下载autotools二进制包即可。如果您在IDE中使用eclipse(我强烈推荐),您可以配置环境以使用自动工具。这样,您只需专注于编写代码。所有可配置选项仍然存在,但您不必知道make。

相关文章:
  • 没有找到相关文章