C ++ Makefile%.c有效,%。cpp不行?

时间:2013-07-21 20:01:10

标签: c++ makefile

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

/ src for .cpp files

  • 的main.cpp
  • check cpp

/ include for .hpp files

  • check.hpp

我的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而不是。

感谢您的帮助:)!

4 个答案:

答案 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)

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