Makefile入门教程

Makefile

Makefile是c++编译的一个脚本文件,各种cpp之间的依赖关系,是可以靠Makefile文件来组织,在Windows上使用VS Studio不会用到这个文件,因为VS Studio已经帮我们完成了,当使用VScode或者在linux开发C++工程时,需要使用到这个文件,下面是一个简单的用例:

##版本1
# 这里第一行表示hello这个工程依赖那些cpp文件,第二行示用g++链接main.cpp 1.cpp 2.cpp,生成hello执行文件
# hello:main.cpp 1.cpp 2.cpp
# 	g++ -o hello main.cpp 1.cpp 2.cpp

# ##版本2
# CXX = g++
# TARGET = hello
# OBJ = main.o 1.o 2.o
# $(TARGET): $(OBJ)
# 	$(CXX) -o $(TARGET) $(OBJ)

## main.0依赖于main.cpp
# main.o: main.cpp
## 使用CXX变量,也就是上面定义的g++,编译main.cpp,生成目标文件main.o
# 	$(CXX) -c main.cpp
# 1.o: 1.cpp
# 	$(CXX) -c 1.cpp
# 2.o: 2.cpp
# 	$(CXX) -c 2.cpp

#版本3
CXX = g++
TARGET = hello
OBJ = main.o 1.o 2.o

$(TARGET) : $(OBJ)
	$(CXX) -o $@ $^
CXXFLAGS = -c -Wall
# 如果源文件很多,可以使用这两行替换很多重复的工作,指定.o文件所依赖的.cpp文件
%.o: %.cpp
	$(CXX) $(CXXFLAGS) $< -o $@

.PHONY: clean
clean:
	del *.o $(TARGET)

工程文件列表截图如下:
在这里插入图片描述
当我们使用可指定程序make去编译C++代码时,make会去寻找当前目录下的Makefile文件,如果文件的命名不叫作Makefile,可以使用 make -f xxxx执行XXX里面的代码;在使用make 执行Makefile之后,当前目录会生成一系列的目标文件(.o文件),如下图所示:
在这里插入图片描述

版本三

这里介绍下版本三的内容,内容如下

CXX = g++
TARGET = hello
OBJ = main.o 1.o 2.o

$(TARGET) : $(OBJ)
	$(CXX) -o $@ $^
CXXFLAGS = -c -Wall
%.o: %.cpp
	$(CXX) $(CXXFLAGS) $< -o $@

.PHONY: clean
clean:
	del *.o $(TARGET)

当执行make clean时,make会找当前目录Makefile中的clean目标,也就是会指定del *.o $(TARGET)命令,.PHONY,表示假目标,当运行目录中存在一个叫做clean的文件时,有了这个假目标,就可以忽略文件中的clean,从而可以执行Makefile中的clean目标;声明一个目标为.PHONY 告诉Make工具,这个目标不代表一个实际的文件,而是表示一个操作或动作,因此无论是否存在同名文件,都会执行对应的命令。例如下图所示,将.PHONY: clean注释,并且在当前目录下存在一个空的文件clean,运行make clean时,会有报错:
在这里插入图片描述
当我们加上.PHONY: clean,并且执行make clean,就会运行del *.o $(TARGET),会删除当前目录所有.o结尾的文件,以及生成的目标运行文件(hello.exe),我实在windows系统上执行的Makefile,所以删除指令用的是del,linux上换为rm即可。

CMake

使用C++代码的同学,经常会听到或者用到CMake,CMake和Makefile的关系时什么呢,我的理解就是CMake可以帮忙实现跨平台的Makefile,使用CMake语法实现一套代码之后,可以在多个平台使用,流程是:CMake文件----使用CMake编译—>Makefile文件----是用make编译—>可指定程序TARGET.exe

参考链接点击在这里,B站的这位老师讲的非常好

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值