生成文件不构建对象,我告诉它如何

Makefile not building objects how I'm telling it to

本文关键字:文件 构建 对象      更新时间:2023-10-16

这是我的项目目录文件树:

.
├── entity.cpp
├── entity.hpp
├── entitytypes.hpp
├── main.cpp
├── Makefile
├── player.cpp
└── player.hpp

Makefile的内容是:

CC=g++
CFLAGS=-Wall -pg
LDFLAGS=-lsfml-graphics -lsfml-window -lsfml-system
EXE=gametest
all: $(EXE)
%.o: %.c
$(CC) -c $< -o $@ $(CFLAGS)
$(EXE): main.o entity.o player.o
g++ $^ -o $@ $(LDFLAGS)

非常奇怪的是,这是我输入make:时的输出

g++    -c -o main.o main.cpp
g++    -c -o entity.o entity.cpp
g++    -c -o player.o player.cpp
g++ main.o entity.o player.o -o gametest -lsfml-graphics -lsfml-window -lsfml-system

正如您所看到的,输出的最后一行对应于Makefile的$(EXE)部分。它将程序与正确的标志等链接起来。我的问题是,当构建每个单独的对象文件时,它根本没有考虑到我的%.o: %.c规则。这一点很清楚,因为当它构建对象时,g++-c之间有很长的差距,这是我没有写的。此外,它还错过了我的$(CFLAGS(。更奇怪的是,当我注释掉%.o: %.c部分时,Makefile做了完全相同的事情。

在我看来,它似乎使用了某种默认的构建命令,而忽略了我的命令。

我看过我过去写的Makefile,据我所知,它们以同样的方式使用完全相同的宏,所以我很困惑为什么会发生这种情况。

您将文件命名为*.cpp,而您的规则显示*.c,这就是原因。

它看起来像是C的半转换Makefile。它使用了错误的变量,并查找C文件而不是C++。试试这个(未经测试(:

CXX := g++
CXXFLAGS := -Wall -pg
LDFLAGS := -lsfml-graphics -lsfml-window -lsfml-system
EXE := gametest
all: $(EXE)
%.o: %.cpp
$(CXX) -c $(CXXFLAGS) -o $@ $< 
$(EXE): main.o entity.o player.o
$(CXX) -o $@ $^ $(LDFLAGS)

C++使用CXX,而C使用CC,与CXXFLAGS相同。

注意:请记住,缩进是TAB,而不是空格!

内置的%.o: %.cpp规则使用CXX(而非CC(来指定编译器,并使用CXXFLAGS

CXX = g++
CXXFLAGS = -Wall -Wextra -pg
LIBS = -lsfml-graphics -lsfml-window -lsfml-system
gametest: main.o entity.o player.o
gametest: LINK.o = LINK.cc