c++_makefile
关于四个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 $@
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通