编译与链接

  对于目前的应用程序开发,我们很少关注编译和链接的过程,通常都使用IDE将编译和链接一部完成,以下使对于编译和链接的过程的具体解析。

首先,要生成机器可以识别的二进制文件,必须经过以下几个步骤:

  预处理 ------> 编译 -------> 汇编 ---------> 链接

一、预处理

 预处理的过程主要处理源文件中以“#”开始的预编译指令。比如“#include”、“#define”等,处理规则如下:

   1、将所有的”#define“删除,并且展开所有的宏定义。

   2、处理所有条件预编译指令,比如“#if”、"#ifdef","#elif",“#else”,"#endif".

   3、将#include的文件插入到预编译指令的位置。注意,这个过程使递归进行的,因为被包含的文件中可能还包含其他文件。

     4、删除所有的注释“//”和“/* */”。

   5、添加行号和文件名标识。

   6、保留所有的#pragma编译器指令,因为编译器要使用它们。

以下用我们熟悉的hello world程序来了解此过程:

1
2
3
4
5
6
#include<stdio.h>
int main()
{
   printf("\nhello,word\n"); 
    return 0;
}

预编译命令:gcc -E hello.c -o hello.i

二、编译

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

 使用编译命令执行hello.i文件生成汇编文件:

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

 

三、汇编

  汇编器是将hi便代码变成机器可以执行的指令,每一条汇编语句对应一条机器指令最终输出目标文件。

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

四、链接

链接就是将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行程序。

1
gcc -o hello hello.o

gcc常用参数:

 

posted @   轻轻的吻  阅读(202)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示