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