千家信息网

C++的Makefile如何使用

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇"C++的Makefile如何使用"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"
千家信息网最后更新 2026年11月02日C++的Makefile如何使用

这篇"C++的Makefile如何使用"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"C++的Makefile如何使用"文章吧。

1. Makefile基本语法与执行

为什么要使用 Makefile?

Makefile 文件描述了整个工程的编译、链接的规则。

为工程编写 Makefile 的好处是能够使用一行命令来完成"自动化编译"。只需提供一个(通常对于一个工程来说会是多个)正确的 Makefile,接下来每次的编译都只需要在终端输入"make"命令,整个工程便会完全自动编译,极大提高了效率。尤其是在编译一个仅有一小部分文件被改动过的大项目的情况下。

绝大多数的 IDE 开发环境都会为用户自动编写 Makefile。

Make 是怎么工作的?

Make 工作的原则就是:

一个目标文件当且仅当在其依赖文件(dependencies)的更改时间戳比该目标文件的创建时间戳新时,这个目标文件才需要被重新编译。

Make 工具会遍历所有的依赖文件,并且把它们对应的目标文件进行更新。编译的命令和这些目标文件及它们对应的依赖文件的关系则全部储存在 Makefile 中。

Makefile 中也指定了应该如何创建,创建出怎么样的目标文件和可执行文件等信息。

除此之外,你甚至还可以在 Makefile 中储存一些你想调用的系统终端的命令,像一个 Shell 脚本一样使用它。

作用:

Makefile 文件告诉 Make 怎样编译和连接成一个程序

可用命令 dnf install make 安装make功能

格式:

按如下格式编写 Makefile

目标(target): 依赖(prerequiries)...
命令(command)

注意:每个命令行前面必须是一个Tab字符,即命令行第一个字符是Tab

实验:

vim Makefile 编辑文件:

simpletest:simple.o simpletest.o        g++ simple.o simpletest.o -o simpletestsimple.o:simple.cpp        g++ -c simple.cpp -o simple.osimpletest.o:simpletest.cpp        g++ -c simpletest.cpp -o simpletest.o

结果为:

[root@foundation1 shishi]# make
g++ -c simple.cpp -o simple.o
g++ -c simpletest.cpp -o simpletest.o
g++ simple.o simpletest.o -o simpletest

命令上下是有顺序的,上一行对下一行具有依赖关系

如果文件夹中已经有.o文件,make后会提示已经生成,需要删除.o文件后再make

clean的作用: 被指定时会删除对应.o文件,避免上述情况

simpletest:simple.o simpletest.o        g++ simple.o simpletest.o -o simpletestsimple.o:simple.cpp        g++ -c simple.cpp -o simple.osimpletest.o:simpletest.cpp        g++ -c simpletest.cpp -o simpletest.oclean:        rm simpletest simple.o simpletest.o

结果为:

[root@foundation1 shishi]# make clean
rm simpletest simple.o simpletest.o
[root@foundation1 shishi]# make
g++ -c simple.cpp -o simple.o
g++ -c simpletest.cpp -o simpletest.o
g++ simple.o simpletest.o -o simpletest

2. Makefile简化过程

使用变量: 如果调用某个文件用的次数较多,可以使用变量代替,变量可以直接替换

变量定义: 变量 = 字符串
变量使用: $(变量名)

makefile 文件可改为:

TARGET = simpletestOBJS = simple.o simpletest.o$(TARGET):$(OBJS)        g++ $(OBJS) -o $(TARGET)simple.o:simple.cpp        g++ -c simple.cpp -o simple.osimpletest.o:simpletest.cpp        g++ -c simpletest.cpp -o simpletest.oclean:        rm $(TARGET) $(OBJS)

命令自动推导: 我们可以发现,由于 .cpp 文件都是生成对应的 .o 文件,所以 makefile 文件是可以自动识别的

makefile 文件可改为:

TARGET = simpletestOBJS = simple.o simpletest.o$(TARGET):$(OBJS)        g++ $(OBJS) -o $(TARGET)simple.o:simple.cppsimpletest.o:simpletest.cppclean:        rm $(TARGET) $(OBJS)

预定义变量: 系统中自己也定义了一些变量

变量程序默认值
CCC语言编译程序cc
CXXC++编译程序g++
ARC++打包程序ar
CPP带有标准输出的C语言预处理程序$(CC) -E
RM删除命令rm

makefile 文件可改为:

TARGET = simpletestOBJS = simple.o simpletest.o$(TARGET):$(OBJS)        $(CXX) $(OBJS) -o $(TARGET)simple.o:simple.cppsimpletest.o:simpletest.cppclean:        $(RM) $(TARGET) $(OBJS)

假想目标: 如果文件夹中有clean文件,那么make clean就不能使用,需要使用假想目标,可以在执行命令时不查看文件夹里面的文件,直接生效

makefile 文件可改为:

TARGET = simpletestOBJS = simple.o simpletest.o.PHONY: clean$(TARGET):$(OBJS)        $(CXX) $(OBJS) -o $(TARGET)simple.o:simple.cppsimpletest.o:simpletest.cppclean:        $(RM) $(TARGET) $(OBJS)

建议不生成目标文件的命令都设为假想目标

3. Makefile生成并使用库

3.1 动态库的建立与使用

vim Makefile 编辑文件:

TARGET = simpletestOBJS = simple.oLIB = libsimple.soCXXFLAGS = -c -fPIC.PHONY: clean$(TARGET):$(LIB) simpletest.o        $(CXX) simpletest.o -o $(TARGET) -L. -lsimple$(LIB):$(OBJS)        $(CXX) -shared $(OBJS) -o $(LIB)simple.o:simple.cpp        $(CXX) $(CXXFLAGS) simple.cpp -o $(OBJS)simpletest.o:simpletest.cpp        $(CXX) $(CXXFLAGS) simpletest.cpp -o simpletest.oclean:        $(RM) $(TARGET) $(OBJS) $(LIB)

结果为:

[root@foundation1 shishi]# make clean
rm -f simpletest simple.o libsimple.so
[root@foundation1 shishi]# make
g++ -c -fPIC simple.cpp -o simple.o
g++ -shared simple.o -o libsimple.so
g++ -c -fPIC simpletest.cpp -o simpletest.o
g++ simpletest.o -o simpletest -L. -lsimple

预定义变量:

还是需要在前面定义

变量程序参数
CFLAGS用于C编译器的额外标志
CXXFLAGS用于C++编译器的额外标志
ARFLAGS用于C/C++打包器的额外标志
LDFLAGS链接库路径-L
LDLIBS链接库-l

makefile 文件可改为:

TARGET = simpletestOBJS = simple.oLIB = libsimple.soCXXFLAGS = -c -fPICLDFLAGS = -L.LDLIBS = -lsimple.PHONY: clean$(TARGET):$(LIB) simpletest.o        $(CXX) simpletest.o -o $(TARGET) $(LDFLAGS) $(LDLIBS)$(LIB):$(OBJS)        $(CXX) -shared $(OBJS) -o $(LIB)simple.o:simple.cpp        $(CXX) $(CXXFLAGS) simple.cpp -o $(OBJS)simpletest.o:simpletest.cpp        $(CXX) $(CXXFLAGS) simpletest.cpp -o simpletest.oclean:        $(RM) $(TARGET) $(OBJS) $(LIB)

自动变量:

自动变量是在规则每次执行时都基于目标和依赖产生新值的变量

自动变量含义
$<表示第一个匹配的依赖
$@表示目标
$^所有依赖
$?所有依赖中更新的文件
$+所有依赖文件不去重
$(@D)目标文件路径
$(@F)目标文件名称

makefile 文件可改为:

TARGET = simpletestOBJS = simple.oLIB = libsimple.soCXXFLAGS = -c -fPICLDFLAGS = -L.LDLIBS = -lsimple.PHONY: clean$(TARGET):simpletest.o $(LIB)        $(CXX) $< -o $@ $(LDFLAGS) $(LDLIBS)$(LIB):$(OBJS)        $(CXX) -shared $^ -o $@simple.o:simple.cpp        $(CXX) $(CXXFLAGS) $< -o $@simpletest.o:simpletest.cpp        $(CXX) $(CXXFLAGS) $< -o $@clean:        $(RM) $(TARGET) $(OBJS) $(LIB)

自动匹配:

通配符主要用于匹配文件名,makefile中使用%作为通配符。从匹配目标格式的目标名中依据通配符抽取部分字符串,再按照抽取字符串分配到每一个依赖格式中产生依赖名。例如,使用%.o:%.cpp

可以让重复的语句合为一句

makefile 文件可改为:

TARGET = simpletestOBJS = simple.oLIB = libsimple.soCXXFLAGS = -c -fPICLDFLAGS = -L.LDLIBS = -lsimpleTESTOBJ = simpletest.o.PHONY: clean$(TARGET):$(TESTOBJ) $(LIB)        $(CXX) $< -o $@ $(LDFLAGS) $(LDLIBS)$(LIB):$(OBJS)        $(CXX) -shared $^ -o $@$(TESTOBJ) $(OBJS):%.o:%.cpp        $(CXX) $(CXXFLAGS) $< -o $@clean:        $(RM) $(TARGET) $(OBJS) $(LIB) $(TESTOBJ)

3.2 动态加载库的建立与使用

TARGET = simpletest2OBJS = simple.oLIB = libsimple.soCXXFLAGS = -c -fPICLDLIBS = -ldlTESTOBJ = simpletest2.o.PHONY: clean# 生成可执行文件$(TARGET):$(TESTOBJ) $(LIB)        $(CXX) $< -o $@ $(LDFLAGS) $(LDLIBS)# 生成库$(LIB):$(OBJS)        $(CXX) -shared $^ -o $@# 生成目标文件$(TESTOBJ) $(OBJS):%.o:%.cpp        $(CXX) $(CXXFLAGS) $< -o $@clean:        $(RM) $(TARGET) $(OBJS) $(LIB) $(TESTOBJ)

结果为:

[root@foundation1 C++7.4]# make clean
rm -f simpletest2 simple.o libsimple.so simpletest2.o
[root@foundation1 C++7.4]# make
g++ -c -fPIC simpletest2.cpp -o simpletest2.o
g++ -c -fPIC simple.cpp -o simple.o
g++ -shared simple.o -o libsimple.so
g++ simpletest2.o -o simpletest2 -ldl
[root@foundation1 C++7.4]# ./simpletest2
Simple()
Test()
~Simple()

以上就是关于"C++的Makefile如何使用"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

文件 目标 变量 命令 编译 程序 生成 内容 字符 C++ 工程 格式 结果 一行 字符串 文件夹 标志 通配符 链接 编译程序 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云南咖啡 亿人帮互联网科技有限公司 互联网科技工作委员会主任 中关村互联网科技集团 互联网是不是新科技 中国 科技 互联网 深圳期待互联网科技 互联网高科技股票 老年人脱离互联网科技的作文 福州新华互联网科技学校 知乎 互联网企业和科技型企业 花神(南京)互联网科技有限公司 科技互联网的核心竞争力 深圳互联网科技的发展 中天科技中国工业互联网 抖集互联网科技技术咨询 银川新华互联网科技学校原画 互联网科技职业技能培训学校 马化腾互联网科技教学 科技互联网专业务虚会材料 互联网科技公司发展 互联网未来科技 重庆科技学院互联网 互联网科技实习生岗位职责 剑昆互联网络科技有限公司临桂 国大互联网教育科技有限公司薪资 互联网科技快讯热点 北京军民互联网科技公司 互联网科技的前景 瑞安市蟠桃会互联网科技有限公司
0