我为c ++文件编写了一个简单的makefile,但这是一个我不明白的问题。 我有2个文件夹
/ src for .cpp files
/ include for .hpp files
我的Makefiles看起来像这样
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而不是。
感谢您的帮助:)!
答案 0 :(得分:5)
因为make正在尝试从.o
文件构建.cpp
,所以在编写%.o : %.c
之类的规则时,它对make没有影响,因为make不会尝试构建{来自.o
的{1}}。因此,make使用自己的内置规则将.c
文件编译到.cpp
文件中,内置规则正常工作。
当您将规则更改为.o
时,现在您的规则与想要构建的规则匹配,因此使用您的规则而不是其自己的内置规则。显然你的规则被破坏了,不起作用。
为什么不起作用?因为您没有使用%.o : %.cpp
,所以$(CPPFLAGS)
标志不会传递给编译器,因此编译器找不到您的头文件。
答案 1 :(得分:3)
C ++语言的flags变量名为CXXFLAGS
,您应该在代码中使用$(CXX)
而不是$(CC)
。 CPPFLAGS
是预处理程序参数的变量。
答案 2 :(得分:1)
使用标准的make文件标志
CXX for g ++ CPP for cpp文件
并尝试:
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $<
答案 3 :(得分: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)
但这在很大程度上取决于项目。