Makefile没有建立对象我如何告诉它

时间:2018-08-01 12:48:26

标签: 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
    $(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也会执行 exact 相同的操作。

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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

看起来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的空格!

答案 2 :(得分:1)

内置的%.o: %.cpp规则使用 CXX (不是CC)指定编译器,并使用 CXXFLAGS (不是CFLAGS)。因此,重新编写Makefile来设置这些变量,而无需自己指定模式规则:

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