C++ Makefile不构建对象如何I';我告诉它

C++ Makefile不构建对象如何I';我告诉它,c++,makefile,C++,Makefile,这是我的项目目录文件树: . ├── 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

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

.
├── 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)
如您所见,输出的最后一行对应于Makefile的
$(EXE)
部分。它用正确的标志等链接程序。我的问题是,在生成每个单独的对象文件时,根本没有考虑我的
%.o:%.c
规则。这一点很清楚,因为当它构建对象时,在
g++
-c
之间有一个很长的差距,这是我没有写的。此外,它还漏掉了我的美元(CFLAGS)。更奇怪的是,当我注释掉
%.o:%.c
部分时,Makefile做了完全相同的事情

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


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

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

您将文件命名为*.cpp,而规则命名为*.c,这就是为什么。

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

CXX:=g++
CXXFLAGS:=-Wall-pg
LDFLAGS:=-lsfml图形-lsfml窗口-lsfml系统
EXE:=游戏测试
全部:$(EXE)
%.o:%.cpp
$(CXX)-c$(CXXFLAGS)-o$@$<
$(EXE):main.o entity.o player.o
$(CXX)-o$@$^$(LDFLAGS)
C++
使用
CXX
C
使用
CC
,与
cxflags
相同


注意:记住缩进是
TAB
s而不是空格

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

CXX:=g++
CXXFLAGS:=-Wall-pg
LDFLAGS:=-lsfml图形-lsfml窗口-lsfml系统
EXE:=游戏测试
全部:$(EXE)
%.o:%.cpp
$(CXX)-c$(CXXFLAGS)-o$@$<
$(EXE):main.o entity.o player.o
$(CXX)-o$@$^$(LDFLAGS)
C++
使用
CXX
C
使用
CC
,与
cxflags
相同


注意:记住缩进是
TAB
s而不是空格

内置的
%.o:%.cpp
规则使用
CXX
(非
CC
)指定编译器,并使用
cxflags
(非
CFLAGS
)作为标志。因此,重新编写Makefile来设置这些变量,您不需要自己指定模式规则:

CXX=g++
CXXFLAGS=-Wall-Wextra-pg
LIBS=-lsfml图形-lsfml窗口-lsfml系统
gametest:main.o entity.o player.o
游戏测试:LINK.o=LINK.cc

内置的
%.o:%.cpp
规则使用
CXX
(非
CC
)指定编译器,并使用
cxflags
(非
CFLAGS
)作为标志。因此,重新编写Makefile来设置这些变量,您不需要自己指定模式规则:

CXX=g++
CXXFLAGS=-Wall-Wextra-pg
LIBS=-lsfml图形-lsfml窗口-lsfml系统
gametest:main.o entity.o player.o
游戏测试:LINK.o=LINK.cc

%.o:%.c
改成
%.o:%.cpp
:-)把
%.o:%.c
改成
%.o:%.cpp
:-)你和@Galik都是对的,我很后悔自己没有注意到这一点。我会尽快接受你的回答。你和@Galik都是对的,我很后悔自己没有注意到这一点。我会尽快接受你的答复。
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
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)