一.make原理和简单使用
make是cmake的过渡工具。
文件准备:
文件结构:

main.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 : "<<display(5)<<endl;
return 0;
}
dj
display.cpp
#include "functions.h"
int display(int n){
if(n==1)
return 1;
else
return n*display(n-1);
}
functions.h
#ifdef _FUNCTIONS_H_
#define _FUNCTIONS_H_
void printhello();
int display(int n);
#endif
printhello.cpp
#include<iostream>
#include "functions.h"
using namespace std;
void printhello(){
int i;
cout<<"Hello World!"<<endl;
}
普通编译:
g++ main.cpp display.cpp printhello.cpp -o main
./main
- 只适合小型项目,对于大型项目来说效率低下
(一)make工具-----makefile

语法:
目标\]: \[依赖
(tab制表符)[命令]
- 目标:规则的目标,可以是 Object File(一般称它为中间文件),也可以是可执行文件,还可以是一个标签;
- 依赖:是我们的依赖文件,要生成 targets 需要的文件或者是另一个目标。可以是多个,也可以是没有;
- 命令:make 需要执行的命令(任意的 shell 命令)。可以有多条命令,每一条命令占一行。
(二)简单使用(Makefile文件编写)
version-1
cpp
hello: main.cpp printhello.cpp factorial.cpp
g++ -o hello main.cpp printhello.cpp factorial.cpp
version-2
cpp
CXX = g++
TARGET = hello
OBJ = main.o printhello.o factorial.o
$(TARGET): $(OBJ)
$(CXX) -o $(TARGET) $(OBJ)
main.o: main.cpp
$(CXX) -c main.cpp
printhello.o: printhello.cpp
$(CXX) -c printhello.cpp
factorial.o: factorial.cpp
$(CXX) -c factorial.cpp
version-3
cpp
CXX = g++
TARGET = hello
OBJ = main.o printhello.o factorial.o
CXXFLAGS = -c -Wall
$(TARGET): $(OBJ)
$(CXX) -o $@ $^
%.o: %.cpp
$(CXX) $(CXXFLAGS) $< -o $@
.PHONY: clean
clean:
rm -f *.o $(TARGET)
version-4
cpp
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)
在Makefile中,自动化变量是一种特殊的变量,它们在规则的命令中使用,用于表示相关的文件或命令。以下是常见的自动化变量解析符:
-
$@
:代表规则的目标文件名。当一个规则有多个目标时,$@
代表当前正在构建的目标。 -
$<
:代表规则的第一个依赖文件名。当一个规则有多个依赖文件时,$<
代表第一个依赖文件。 -
$^
:代表规则的所有依赖文件列表,以空格分隔。如果有重复的依赖文件,它们只会出现一次。 -
$?
:代表比目标新的所有依赖文件列表,以空格分隔。如果没有依赖文件比目标新,则为空。 -
$*
:代表目标文件去除后缀之后的部分。例如,如果目标文件是foo.o
,那么$*
就代表foo
。 -
$(@D)
:代表目标文件所在的目录。例如,如果目标文件是build/foo.o
,那么$(@D)
就代表build/
。 -
$(@F)
:代表目标文件的文件名部分。例如,如果目标文件是build/foo.o
,那么$(@F)
就代表foo.o
。 -
$n(n≥1):传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 ,第二个参数是1,第二个参数是2>。
-
$# :传递给脚本或函数的参数个数。
这些自动化变量解析符可以方便地在Makefile中使用,以引用相关的文件名或目录。通过结合这些变量,可以更加灵活和高效地编写自动化构建规则