编译链接过程
- 预处理 ----> 编译 ----> 汇编 ----> 链接
- 预处理:
- 任务:处理宏定义,文件包含,条件编译(加#开头的,命令)
- name.c(源代码)---->name.i(改装后的)
gcc -E name.c -o name.i
- 编译:
- 任务:检查语法
- name.i(改装后的)---->name.s(汇编代码)
gcc -S name.i -o name.s
- 汇编:
- 任务:汇编代码转机器码
- name.s(汇编代码)--->name.o(二进制目标文件)
gcc -c name.s -o name.o
- 链接:
- 任务:将经过编译的若干个中间文件(二进制目标文件)和系统库(.a/.lib)链接为可执行文件
- name.o---->a.out/name.exe(可执行程序)
- 静态链接:整个拷贝库文件进可执行程序
- 动态链接:可执行文件中加入了所调用函数的描述信息,运行时再去链接动态库(DLL),根据链接产生的重定位信息,去寻找和执行DLL中相应的函数代码。
gcc name.o -o name
makefile书写
target... : dependency...
command
...
...
- target:目标文件(.o)/可执行文件/标签(Label)
- dependency:生成target需要的依赖
- command:make真正要执行的命令(任意的shell命令)
检查,dependency中文件若更新,此make命令就会被执行,会引起链式反应
make命令执行
make
执行第一个target,根据依赖性向后寻找并执行
make Label
去Label处开始执行,如clean(clean 无依赖,不用检查)
- 删除所有中间文件
clean :
rm -f *.o
make clean
执行
简易版本的makefile编写
net : server.o client.o
g++ -g server.o -o server
g++ -g client.o -o client
server.o : server.cpp
g++ -c server.cpp
client.o : client.cpp
g++ -c client.cpp
clean :
rm -f *.o
此时如果改变了某一源文件就之后执行对应的编译步骤,节省了时间。
makeflie中的变量
- 三个系统变量
$@
--目标文件,$^
--所有的依赖文件,$<
--第一个依赖文件。 - 自定义变量和使用:$(变量名)
myobj = 1.o 2.o 3.o
test : $(myobj )
g++ $(myobj) -o test
...
...
clean:
rm edit $(myobj )
加上变量和模式匹配后的makefile
net : server.o client.o
g++ -g server.o -o server
g++ -g client.o -o client
%.o : %.c
g++ -c $< -o $@
#server.o : server.cpp
# g++ -c server.cpp
#client.o : client.cpp
# g++ -c client.cpp
clean :
rm -f *.o
Makefile的编写还有很多用法
参考博主好文https://blog.csdn.net/weixin_38391755/article/details/80380786
内容很多,包含所有makefile的问题