• Linux 基本语句_编译C过程


    Linux撰写C语言并编译的过程

    1、预处理

    将所有的#define删除,并且展开所有的宏定义,并且处理所有的条件预编译指令,比如#if #ifdef #elif #else #endif等。处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。删除所有注释“//”和“/* */”。添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。保留所有的#pragma编译器指令,后续编译过程需要使用它们。

    命令:

    gcc -E hello.c -o hello.i //将hello.c文件预处理至hello.i文件,-E指处理完停止
    
    • 1

    2、编译

    编译过程就是对预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后生成相应的汇编代码。

    命令:

    gcc -S hello.i -o hello.s
    
    • 1

    3、汇编

    将汇编语言转成二进制,但是还不能执行因为调用了一些库函数,这些库函数还没被解析,例如#include的printf函数还未被解析,需要执行链接操作

    汇编命令:

    gcc -c hello.s -o hello.o
    
    • 1

    4、链接

    链接也分为静态链接和动态链接,其要点如下:
    静态链接是指在编译阶段直接把静态库加入到可执行文件中去,这样可执行文件会比较大。链接器将函数的代码从其所在地(不同的目标文件或静态链接库中)拷贝到最终的可执行程序中。为创建可执行文件,链接器必须要完成的主要任务是:符号解析(把目标文件中符号的定义和引用联系起来)和重定位(把符号定义和内存地址对应起来然后修改所有对符号的引用)。

    命令:

    gcc hello.o
    
    • 1

    这里补充一下静态库、动态库、库文件

    库:

    库是预编译的目标文件(object files)的集合,它们可以被链接进程序。
    我们在写c语言的时候,经常会去包含一个.h的头文件,这个头文件就是库文件例如:

    动态库与静态库

    静态链接是指在编译阶段直接把静态库加入到可执行文件中去,这样可执行文件会比较大。动态链接则是指链接阶段仅仅只加入一些描述信息,而程序执行时再从系统中把相应动态库加载到内存中去。

  • 相关阅读:
    Eureka删除失效服务
    合并石子问题-区间dp总结
    Android webView JS 之间的交互
    STC51单片机学习笔记3——C语言流水灯
    linux cat命令详解,作用,说明
    servlet页面以及控制台输出中文乱码
    NetSuite 关闭期间的销售订单可否修改
    【GESP考级C++】1级样题 闰年统计
    第33节——useRef
    ES集群&kibana安装
  • 原文地址:https://blog.csdn.net/xyint/article/details/133365325