美文网首页转载部分
编译链接过程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