编译与链接
对于目前的应用程序开发,我们很少关注编译和链接的过程,通常都使用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常用参数:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于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)