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