1

我为 c++ 文件编写了一个简单的 makefile,但这是一个我不明白的问题。我有 2 个文件夹

/src 用于 .cpp 文件

  • 主文件
  • 检查cpp

/include 用于 .hpp 文件

  • 检查.hpp

我的 Makefile 看起来像这样

LIBS = -lsfml-graphics -lsfml-window -lsfml-system
CC   = g++
VPATH = src include
CPPFLAGS = -I include

### Files ###
OBJ = main.o check.o

### Rules ###
all: sfml-app

sfml-app: $(OBJ)
    $(CC) -o sfml-app $(OBJ) $(LIBS)

%.o: %.c
    $(CC) -c $<

clean:
    rm -rf *o $(OBJ) 

如果我像这样使用我的makefile,一切正常。但是如果我将%.o: %.c更改为%.o: %.cpp他说

src/main.cpp:2:21: critical  error: check.hpp: file or folder not found

即使它是一个 c++ 项目,写 .cpp 而不是 .c 是错误的吗?这让我有点困惑。为什么 .c 有效 finde 而 .cpp 无效。

感谢您的帮助 :) !

4

4 回答 4

5

因为 make 正在尝试.o.cpp文件构建 a,所以当您编写类似这样的规则时,%.o : %.c它对 make 没有影响,因为 make 不会尝试.o.c. 因此,make 使用自己的内置规则将文件编译.cpp.o文件中,并且内置规则可以正常工作。

当您将规则更改为 时%.o : %.cpp,现在您的规则与 make 想要构建的内容匹配,因此 make 使用您的规则而不是它自己的内置规则。显然,您的规则已被破坏并且不起作用。

为什么它不起作用?因为你没有使用$(CPPFLAGS),所以-I include标志没有传递给编译器,所以编译器找不到你的头文件。

于 2013-07-21T20:08:11.340 回答
3

C++ 语言的 flags 变量称为CXXFLAGS,您应该在代码中使用$(CXX)而不是使用$(CC)CPPFLAGS是预处理器参数的变量。

于 2013-07-21T20:09:21.923 回答
1

使用标准的 make 文件标志

CXX 用于 g++ CPP 用于 cpp 文件

并尝试:

%.o: %.cpp
 $(CXX) $(CXXFLAGS) -c $<
于 2013-07-21T20:18:24.917 回答
1

默认规则是:

对于 C 文件:

$(CC) -c $(CPPFLAGS) $(CFLAGS) $?

对于 C++ 文件

$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $?

对于链接:

$(CC) $(LDFLAGS) $^ $(LOADLIBES)

CPPFLAGS 应该是预处理器标志。另外两个(CFLAGS CXXFLAGS)是特定语言的标志。您应该这样调整您的使用情况。

明确定义目标文件也是不寻常的:

OBJ = main.o check.o

定义源文件更为常见。然后根据源文件定义目标文件

OBJ = $(patsubst %.cpp, %.o, $(SRC))

就我个人而言,我喜欢在目录中构建所有内容,所以使用

SRC = $(wildcard *.cpp)

但这在很大程度上取决于项目。

于 2013-07-21T21:53:43.840 回答