美文网首页转载部分
编译链接过程gcc以及Makefile

编译链接过程gcc以及Makefile

作者: FakeCSer爱去网吧 | 来源:发表于2020-03-05 21:06 被阅读0次

编译链接过程

  • 预处理 ----> 编译 ----> 汇编 ----> 链接
  • 预处理:
    • 任务:处理宏定义,文件包含,条件编译(加#开头的,命令)
    • 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的问题

相关文章

网友评论

    本文标题:编译链接过程gcc以及Makefile

    本文链接:https://www.haomeiwen.com/subject/ljmcrhtx.html