C++生成文件%.C有效,%.cpp无效

C++ Makefile %.c works, %.cpp not?

本文关键字:cpp 无效 有效 文件 C++      更新时间:2023-10-16

我为c++文件编写了一个简单的makefile,但这里有一个我不理解的问题。我有两个文件夹

/.cpp文件的src

  • main.cpp
  • 检查cpp

/包括.hpp文件

  • check.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

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

感谢您的帮助:)!

因为make正试图从.cpp文件构建.o,所以当您编写像%.o : %.c这样的规则时,它对make没有影响,因为make并没有尝试从.c构建.o。因此,make使用自己的内置规则将.cpp文件编译为.o文件,内置规则运行良好。

当您将规则更改为%.o : %.cpp时,现在您的规则与make想要构建的规则相匹配,因此make使用您的规则,而不是自己的内置规则。很明显,你的规则被打破了,不起作用。

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

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

使用标准生成文件标志

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

并尝试:

%.o: %.cpp
 $(CXX) $(CXXFLAGS) -c $<

默认规则为:

对于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)

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