关于四个version的思考,既然makefile的使用是为了便捷,从刚开始第一个简版的makefile有什么用,到第二版可以用依赖来抽象出1 $(TARGET)和$(OBJ)之间的关系 2 .o .cpp之间的关系,再到version3可以去用.o .cpp去模块化单独写每一个.o和.cpp文件之间关系这一步。
但是version4用了一个SRC集成了所有的.cpp文件,这样在.cpp文件增加的时候不需要额外写东西,直接就能继续重新编译。
Makefile make 有什么用呢
按照Makefile中给定的语法去帮助我们编译多个文件
make命令会根据是否更改了这个文件,决定要不要编译它,或者根据根据之前的编译结果直接链接
可以指定用什么编译 $(CXX) e.g.(g++),需要说明依赖关系
make 命令默认找到 Makefile去g++文件
不然指定make -f (Makefile)
比如Makefile现在内容是
Makefile
hello: main.cpp printhello.cpp factorial.cpp
g++ -o hello main.cpp printhello.cpp factorial.cpp
注意此处的g++前为tab,不能为space,因为tab告诉文件这个Makefile执行什么
当编译的文件很多时很麻烦,所以升级为version2
CXX : g++
TARGET : hello
OBJ = main.o printhello.o factorial.o
下面这行命令在说,TARGET依赖于这些OBJ文件
$(TARGET) : $(OBJ)
$(CXX) -o $(TARGET) $(OBJ)
main.o printhello.o factorial.o的依赖是这么来的
main.o: main.cpp
$(CXX) -c main.cpp
printhello.o: printhello.cpp
$(CXX) -c printhello.cpp
factorial.o: factorial.cpp
$(CXX) -c factorial.cpp
小结:version2中其实就是指定了依赖关系,我们的TARGET是生成hello,然后hello并不存在,就需要生成它,生成它依赖于OBJ,我们通过给出几个OBJ去查看OBJ又是依赖什么。
make命令会根据是否更改了这个文件,决定要不要编译它,或者根据根据之前的编译结果直接链接
常用命令:
rm *.o(删去当前生成的所有.o文件)
ll(列出当前的所有文件)
$@, $<, $^, 还有SRC这种
version3和4懒得说明了
CXX = g++
TARGET =hello
OBJ = main.o printhello.o factorial.o
Wall 代表Warnings全部表示
CXXFlAGS = -c Wall
$(TARGET) : $(OBJ)
$(CXX) -o $@ $^
前面表示了三个.o文件是怎么来的,现在可以统一写成每个cpp文件都从o里面来
%.o %.cpp
$(CXX) $(CXXFLAGS) $< -o $@
防止存在一个叫clean的文件,因为已经有了就不需要生成了。而.PHONY依赖于clean,永远不会存在一个叫做.PHONY的文件,就一定会运行clean
.PHONY: clean
clean:
rm -f *.o $(TARGET)
version4:
CXX = g++
TARGET =hello
SRC = $(wildcard *.cpp)
OBJ = $(patsubst %.cpp, %.o, $(SRC))
CXXFlAGS = -c Wall
$(TARGET) : $(OBJ)
$(CXX) -o $@ $^
%.o %.cpp
$(CXX) $(CXXFLAGS) $< -o $@
标签:文件,OBJ,TARGET,CXX,makefile,c++,cpp,main From: https://www.cnblogs.com/hxjiang/p/16934217.html