当前位置: 首页 > news >正文

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指处理完停止

2、编译

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

命令:

gcc -S hello.i -o hello.s

3、汇编

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

汇编命令:

gcc -c hello.s -o hello.o

4、链接

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

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

库:

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

动态库与静态库

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

http://www.lryc.cn/news/177410.html

相关文章:

  • MYSQL8解压版 windows 主从部署步骤及配置(包含配置文件,教程文件,免积分下载)
  • RabbitMQ的基本介绍
  • AI智能视频监控技术如何助力美好乡村建设?
  • 【网络安全】2023年堡垒机品牌大全
  • makefile相关知识的讲解
  • OpenCV中的HoughLines函数和HoughLinesP函数到底有什么区别?
  • Xilinx FPGA 程序固化重新上电程序不运行的问题
  • c++ 使用rapidjson对数据序列化和反序列化(vs2109)
  • 4.迭代最近点ICP及非线性优化求解
  • 【redis总结】
  • 图数据库:释放关系的力量
  • Windows系统如何临时关闭“Windows安全中心实时保护”
  • 二叉树MFC实现
  • Nginx之客户并发数限制解读
  • 白捡一个存储型XSS
  • SpringMVC 学习(五)转发,重定向和传参
  • selenium不定位元素直接使用键盘操作(如弹框操作)
  • Inno Setup安装中文语言
  • 【数据库——MySQL】(10)视图和索引
  • No servers available for service: renren…。 Gateway 网关报503错误 ,已解决
  • 【Spring Cloud】深入理解 Eureka 注册中心的原理、服务的注册与发现
  • 添加路径到头文件默认搜索路径
  • 掌动智能:替代JMeter的压力测试工具有哪些
  • Casper Network 构建企业级区块链生态的野望
  • TiDB 7.1.0 LTS 特性解读丨关于资源管控 (Resource Control) 应该知道的 6 件事
  • Django Web开发入门基础
  • Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切(ROI)功能(C#)
  • LetCode算法题---第2天
  • Leetcode.2571 将整数减少到零需要的最少操作数
  • 微前端无界 项目使用记录