C++生成文件%.C有效,%.cpp无效
C++ Makefile %.c works, %.cpp not?
我为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)
但这在很大程度上取决于项目。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- Linux的Cpp上的计时器
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 命名空间中具有.h和.cpp文件的类
- 内置函数可查看CPP中的成员变量
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 无法访问嵌套类.类的使用无效
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 从 'int' 到 'int*' CPP 的转换无效
- cpp 检查抱怨危险使用 c_str(). c_str() 返回的值在本次调用后无效,如何解决?
- 主.cpp:63:12:错误:从 'int (*)[4]' 到 'int' [-允许] 的转换无效。我做错了什么?
- main.cpp|15|错误:从 'const char*' 到 'char' 的转换无效 [-允许]|制作游戏时出错
- Cpp.中的私有静态数据成员只能在其定义时初始化,而类内初始化无效
- 如何修复此错误 cmdline.cpp:93:1:错误:从'int'到'option_type'的转换无效 [-允许]
- C++生成文件%.C有效,%.cpp无效
- 使用aws-sdk-cpp-sqs库时遇到Free()无效指针
- cpp - valgrind -无效的读取大小为8
- 计算器.cpp:48:24:错误:从 'char' 到 'const char*' 的转换无效 [-允许]
- free(): Cpp中下一个大小(快速)无效