0

我对 Makefiles 非常陌生,我目前正在尝试在我开始的项目上构建我的第一个。

我遇到的问题是让它自动知道如何处理我所有的 .cpp 文件,而无需为每个文件定义规则。

我还希望我的目标文件都放在一个文件夹中,在这种情况下是$(PLATFORM)/obj/ where 。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 时,我想确保自己学习得当。

谢谢

4

2 回答 2

0

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

于 2012-12-02T01:12:48.527 回答
0

make看到它需要创建win32/obj/main.o,但看不到任何规则来告诉它如何做到这一点。

你有三个规则,一个 for all,一个 for%.o和一个 for $(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您实际上是在覆盖预定义的规则。我建议你在某个时候尝试根本不给出这个规则(但仍然定义CXXand CXXFLAGS),看看会发生什么。有关详细信息,请参阅

于 2012-12-02T01:14:15.123 回答