废话不多说,makefile就是一个脚本,实现c/c++编译,生成可执行文件
它的语法,刚上手会眼花缭乱,所以循序渐进会比较好
视频讲解: 于仕琪
参考资料: 笔记
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
`
以下是简单的介绍,吃透还得多用,这东西,不练忘的特别快
#版本一: 注意table键在不同的环境缩进的空格数不同
Hello:main.cpp printthehello.cpp factorial.cpp
g++ -o hello main.cpp printthehello.cpp factorial.cpp
#版本二:
CXX = g++ #采用g++编译器
TARGET=hello #生成的目标位hello 可执行文件
OBJ=mai n.o printthehello.o factorial.o #依赖这些编译文件
#执行
$(TARGET):$(OBJ)
$(CXX) -o $(TARGET) $(OBJ)
Main.o:main.cpp
$(CXX) -c main.cpp
printthehello.o:printthehello.cpp
$(CXX) -c printthehello.cpp
factorial.o:factorial.cpp
$(CXX) -c factorial.cpp
#改进点:只编译修改的文件,而不必全部编译
#版本三:
CXX = g++ #采用g++编译器
TARGET=hello #生成的目标位hello 可执行文件
OBJ=mai n.o printthehello.o factorial.o #依赖这些编译文件
CXXFLAGS = -c - wall #编译选项 所有的wraing都显示出来
$(TARGET):$(OBJ)
$(CXX) -o $@ $^ # $@等价于$(TARGET) $^ 等价于$(OBJ)
%.o:%.cpp #不用再写三条 例如 g++ -E main.cpp main.o
$(CXX) $(CXXFLAGS) $< -o $@ # $< 表示指定依赖中的第一个依赖
.PHONY:clean #添加这个行代码简单理解就是为了避免与当前文件夹出现同名clean的冲突,导致无法执行删除
clean:
rm -f *.o $(TARGET) #强制删除所有的 .o和目标文件#命令行行为:make clean
#版本四:
CXX = g++ #采用g++编译器
TARGET=hello #生成的目标位hello 可执行文件
SRC = $(wildcard *.cpp)
OBJ = $(patsubst %.cpp, %.o, $(SRC))
CXXFLAGS = -c - wall #编译选项 所有的wraing都显示出来
$(TARGET):$(OBJ)
$(CXX) -o $@ $^
%.o: %.cpp
$(CXX) $(CXXFLAGS) $< -o $@
.PHONY:clean
clean:
rm -f *.o $(TARGET)
总结
对版本四的详细介绍:
CXX = g++ #采用g++编译器
变量CXX就代表着g++ 也就是c++编译器
TARGET=hello #生成的目标位hello 可执行文件
变量TARGET 表示生成的可执行文件为hello
SRC = $(wildcard *.cpp)
变量SRC表示着 “收集”列表中的所有cpp文件
$(wildcard pattern) 返回所有.cpp文件
OBJ = $(patsubst %.cpp, %.o, $(SRC))
$(patsubst pattern, replacement, text)
表示把所有的.cpp文件替换成相应的.o文件
变量OBJ 表示着所有的所有的.o文件
CXXFLAGS = -c - wall #编译选项 所有的wraing都显示出来
$(TARGET):$(OBJ)
$(CXX) -o $@ $^
编译编译生成hello可执行文件
$@ 表示目标文件(指的是hello可执行文件)
$^ 表示所有依赖的文件(指的是所有的.o文件)
%.o : %.cpp
$(CXX). $(CXXFLAGS) $< -o $@
把所有的.cpp一一对应编译成相应的.o文件
.PHONY:clean
避免发生文件名冲突,我就是要删除我编译的clean文件,而不是其他的同名文件
clean:
rm -f *.o $(TARGET)
删除所有的.o 文件和hello可执行文件