那个网站点击率高,怎么把html文件生成网址,天津网站建设首选 津坤科技,南京百度网站排名Makefile学习
https://maxwell-lx.vip/basic-usage-make/
https://zhuanlan.zhihu.com/p/92010728
https://zhuanlan.zhihu.com/p/350297509
一、是什么
可以理解为一个自动化的编译脚本#xff0c;避免繁琐的手动编译过程。有点类似shell脚本。
1.1 从小例子入手
避免繁琐的手动编译过程。有点类似shell脚本。
1.1 从小例子入手
1新建项目文件夹hello及文件main.cppfactorial.cppprinthello.cppfunctions.h。
hello目录的结构如下
hello/
├──main.cpp
├──factorial.cpp
├──printhello.cpp
└──functions.hmain.cpp
#define _FUNCTIONS_H_#include iostream
#include functions.h
using namespace std;int main()
{printhello();cout This is main: endl;cout The factorial of 5 is: factorial(5) endl;return 0;
}printhello.cpp
#include iostream
#include functions.h
using namespace std;void printhello()
{int i;cout Hello World! endl;
}factorial.cpp
#include functions.hint factorial(int n)
{if (n1)return 1;elsereturn n * factorial(n-1);
}function.h
#ifdef _FUNCTIONS_H_
#define _FUNCTIONS_H_
void printhello();
int factorial(int n);
#endif2那么我们一般手动执行的命令为
g main.cpp factorial.cpp printhello.cpp -o main
./main这种方法适用于小型项目。对于大型项目来说此法编译效率低
3新建Makefile
hello: main.cpp printhello.cpp factorial.cppg -o hello main.cpp printhello.cpp factorial.cpp在命令行上直接运行make命令就能出现hello可执行文件
二、Makefile解析
2.1 大致了解一个Makefile
对于一个初学者大概浏览一个makefile
1、区分前处理/变量处理根据规则定义或处理参数 。
2、找到target: 包含了冒号colon 。arget都是顶格抒写的 : *** target下面的带[tab]缩进的行,就是它包含的命令找到所有的target。
3、执行target: 一般是实现第一个target也可以用make 指定如make clean就只执行clean 这个target。 2.2 Makefile的语法
简单的分为三个部分目标、依赖、命令
[目标]: [依赖]
(tab制表符)[命令]目标规则的目标可以是 Object File一般称它为中间文件也可以是可执行文件还可以是一个标签依赖可以是生成 targets 需要的文件或者是目标。可以是多个也可以是没有命令make 需要执行的命令任意的 shell 命令。可以有多条命令每一条命令占一行。
2.3 工作原理 从第一个target开始检查它的依赖是否都存在如果存在的话就执行当前target下的命令。
否则就往下查找寻找新规则生成依赖。
三、实战
3.1 version1
hello: main.cpp printhello.cpp factorial.cppg -o hello main.cpp printhello.cpp factorial.cpp版本1就相当于普通的编译命令。
3.2 version2
CXX g
TARGET hello
OBJ main.o printhello.o factorial.o$(TARGET): $(OBJ)$(CXX) -o $(TARGET) $(OBJ)main.o: main.cpp$(CXX) -c main.cppprinthello.o: printhello.cpp$(CXX) -c printhello.cppfactorial.o: factorial.cpp$(CXX) -c factorial.cpp版本2分离编译器、目标、对象但是还是不够智能。增加一个cpp文件需要改动的地方很多。
3.3 version3
CXX g
CXXFLAGS -c -Wall
TARGET hello
OBJ main.o printhello.o factorial.o$(TARGET): $(OBJ)$(CXX) -o $ $^%.o: %.cpp$(CXX) $(CXXFLAGS) $ -o $.PHONY: clean
clean:rm -f *.o $(TARGET)版本3引入了自动变量、通配符、.PONY。
1自动变量小撇
目标 依赖$ 目标名$^ 所有依赖的文件名$ 第一个依赖的文件名
2通配符%匹配0个或多个任意字符。
3.PHONY的作用比较特殊跟在它后面的目标都被称为伪目标。
如果 make 伪目标不管该目录下是否有伪目标同名的文件即使有也不会产生冲突都会执行执行伪目标的依赖的命令。
3.4 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 $.PHONY: clean
clean:rm -f *.o $(TARGET)