【makefile制作与g++编译】

本文详细介绍了G++编译的基本过程,包括预处理、编译、汇编和链接四个步骤,以及Makefile在多源文件项目中的作用和语法。通过实例演示了如何创建Makefile以简化编译流程并管理依赖关系。
摘要由CSDN通过智能技术生成

1. g++编译基本过程:

g++通过编译C++代码生成可执行程序,主要分为以下四个步骤:
(step1)预定义阶段:对宏定义、包含的头文件、注释和相关库文件进行处理,使用g++ -E命令;

g++ -E helloworld.cpp helloworld.h -o helloworld.ii

运行结束后,生成 helloworld.ii 文件。

(step2)编译阶段:检查C++中的语法问题,将预处理后的 helloworld.ii 文件转换成汇编语言,使用 g++ -S 命令;

g++ -S helloworld.ii -o helloworld.s

运行结束后,生成 helloworld.s 文件。

(step3)汇编阶段:将汇编文件 helloworld.s 转换成目标文件,使用 g++ -c 命令;

g++ -c helloworld.s -o helloworld.o

运行结束后,生成 helloworld.o 文件。

(step4)链接阶段:链接目标文件,生成可执行文件,使用 g++ -o 命令;

g++ helloworld.o -o helloworld

运行结束后,生成 helloworld 可执行文件。

当然也可以选择更快捷的方式。
上述的步骤中的(step3)汇编也可以通过一句命令行实现,即从 helloworld.cpp 文件直接生成 helloworld.o 文件

g++ -c helloworld.cpp -o helloworld.o

因此,在进行 g++ 编译时,可以简化成 2 个步骤我们可以先生成 *.o 的目标文件,再将目标文件链接,生成可执行文件。

g++ -c helloworld.cpp -o helloworld.o
g++ helloworld.o -o helloworld

以上为g++编译的基本过程。
-------------------------------------------------分割线-----------------------------------------------------------

2. 什么是makefile文件?

一个工程中有多个源文件,Makefile定义了一系列文件编译的顺序和规则,在大多数IDE 开发环境中都可以使用。makefile写完后使用make命令,即可实现工程的自动编译。

-------------------------------------------------分割线-----------------------------------------------------------

3. 制作Makefile文件

3.1 Makefile 语法

TARGET(目标)...:PREREQUISITES(依赖)
	COMMAND(命令)
	...
	...

目标:是指最终要生成的可执行文件
依赖:是指生成目标所需要的文件
命令:利用命令将依赖生成可执行文件(命令处需要用Tab缩进)

3.2 示例
helloworld:hello.o helloworld.o
g++ hello.o helloworld.o -o helloworld
hello.o:hello.cpp
g++ -c hello.cpp -o hello.o
helloworld.o:helloworld.cpp
g++ -c helloworld.cpp -o helloworld.o
Note:如果原本已存在 .o 文件,需要先删除。

3.3 g++ 编译时特殊符号和函数
$@: 表示目标文件
$^ : 表示所有的依赖文件
$< : 表示第一个依赖文件(依赖目标是以 “%” 定义,则是符合模式的一系列的文件集,将 .o 文件一个一个取出来)
wildcard:获取工作目录下所有 .cpp 文件列表
用法如下:获取 /home/demo 目录下所有的 .cpp 文件

SRCS = $(wildcard /home/demo/*.cpp)

patsubst:替换通配符
用法如下:将 /home/demo/ 目录下所有的 .cpp 文件,替换成 .o为后缀名的文件

OBJS = $(patsubst %.cpp %.o, $(SRCS))

3.4 采用通配符编写 makefile
针对示例 3.2 的优化

CROSS = 
COMPLIER = $(CROSS)g++

SRCS = $(wildcard /home/demo/*.cpp)
OBJS = $(patsubst %.cpp, %.o, $(SRCS))
TARGET = helloworld

$(TARGET):$(OBJS)
	$(COMPLIER) $(OBJS) -o $(TARGET)
$(OBJS):%.o : %.cpp
	$(COMPLIER) -c -o $@ $<

clean:
	rm $(TARGET) *.o 

-------------------------------------------------分割线-----------------------------------------------------------

以上内容参考链接:
https://blog.csdn.net/sinat_39037205/article/details/121869349
https://blog.csdn.net/Three_dog/article/details/103688043
https://blog.csdn.net/wuwenbin12/article/details/125706663

  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值