make使用简介
make工具用以简化编译过程,当编译一个包括成百上千个文件的大型项目时,逐个文件编译繁琐且低效,并且当更新某个文件之后,还需要重新再编译一次。makefile文件正是为解决此类问题而诞生的。现在绝大多数IDE,包括Window下的VS等IDE均使用makefile文件,只不过由系统自动生成,编程人员感觉不到而已。
在linux环境下,理解简单的makefile文件,能使用make工具,可以加速开发过程以及编译安装源码文件的痛苦。
通常情况下,如果在某个目录下运行:
make
则自动执行此目录下的makefile文件(或者Makefile文件),如果在此目录下有多个Makefile文件,则运行如下命令可以指定运行的makefile文件
make -f Makefile.linux
编译过程一般包括编译和链接两个过程:
编译:从源文件到.O文件生成;
链接:生成可执行文件
如一个项目包括四个源文件:main.cpp hello.cpp factorial.cpp,最终要生成可执行文件hello,则利用如下命令即可生成:
g++ main.cpp hello.cpp fractorial.cpp -o hello
撰写makefile文件的基本规则是:
target: dependencies
[tab] system command
其中,target表示生成目标,dependencies表示生成目标时依赖的选项,system command表示生成目标所需要的命令,如针对上例中的makefile文件可写为:
all:hello
hello: main.cpp hello.cpp factorial.cpp
g++ main.cpp hello.cpp factorial.cpp -o hello
如果描述依赖关系更准确些,则上例中的makefile文件可写成:
all: hello
hello: main.o hello.o factorial.o
g++ main.o hello.o factorial.o hello
main.o: main.cpp
g++ -c main.cpp
hello.o: hello.cpp
g++ -c hello.cpp
factorial.o: factorial.cpp
g++ -c factorial.cpp
当然,也可以使用变量,如:
CC=g++
CFLAGS=-c -Wall
all: hello hello: main.o factorial.o hello.o
$(CC) main.o factorial.o hello.o -o hello
main.o: main.cpp
$(CC) $(CFLAGS) main.cpp
factorial.o: factorial.cpp
$(CC) $(CFLAGS) factorial.cpp
hello.o: hello.cpp
$(CC) $(CFLAGS) hello.cpp
clean: rm -rf *o hello #表示删除其中的所有.o文件
下面是更复杂的写法,如果能理解,则对于一般的makefile的阅读应该没什么问题
CC=g++ CFLAGS=-c -Wall LDFLAGS= SOURCES=main.cpp hello.cpp factorial.cpp OBJECTS=$(SOURCES:.cpp=.o) EXECUTABLE=hello all: $(SOURCES) $(EXECUTABLE) $(EXECUTABLE): $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) -o $@ .cpp.o: $(CC) $(CFLAGS) $< -o $@
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!