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 $@

posted @   xing_j  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示