程序员的自我修养


《程序员的自我修养》读书笔记 第二章 编译和链接

戏子无情 提交于 2019-12-05 20:51:15
2.1 被隐藏了的过程 在平常的应用程序开发中一般都不需要关注编译和链接过程,因为在IDE开发环境中一般都将编译和链接合到一起一步完成,直接生成可执行文件;通常将这个过程称为 构建(Buil) 。 对于最经典的C语言版"Hello World"的代码: #include <stdio.h> int main() { printf("Hello World\n"); return 0; } 我们在Linux下使用GCC来编译该代码时,只需使用几行简单的命令就完成对上述代码的编译等一系列过程(假设源码文件名为hello.c),生成可直接运行的的程序: $gcc hello.c $./a.oout Hello World 事实上,上述过程可分解为4个步骤,分别是 预处理(preprocess) 、 编译(compilation) 、 汇编(assembly) 和 链接(linking) ,其中前三个阶段都是文本形式的处理,如下图所示: 下面分别大致介绍下各个步骤的作用。 预编译 预编译过程主要处理那些源代码文件中以“#”开始的预编译指令。比如“#include”、“#define”等,常见的处理规则如下: 将所有的“#define”删除,并且展开所有的宏定义。 处理所有条件预编译指令,比如“#if”、“#ifdef”、“#endif”等。 处理“#include”预编译指令

编译链接是如何得到可执行文件的呢?

让人想犯罪 __ 提交于 2019-12-01 04:29:46
盘古开天辟地!我们写了个C语言源文件,那从源文件到可执行程序这中间又发生了什么?编译,链接这些概念又是什么意思?带着对这些问题的好奇,我查了一些资料。其中,主要参考的是《程序员的自我修养》这本书和一些网上的博客。 在 windows 下经常只需要单击 Run 或者 Debug 就可以运行一个C语言程序,这种便利隐藏了背后的复杂机制,而我想知道这背后到底发生了什么。 本文所使用的系统是 ubuntu ,但这些概念也适用于 windows 下。 1. 编译源文件的四个阶段 假如我们写了一个很简单的 helloworld.c 程序: #include <stdio.h> int main(int argc, char *argv[]) { printf("Hello,World!\n"); return 0; } 我们都知道运行命令 gcc helloworld.c -o helloworld 便可以对这个文件进行编译,并命名可执行文件为 helloworld 。然后运行 ./helloworld Hello,World! 便可以执行该文件,但是这背后又经历了什么呢? 注意: 本文并不是一篇严谨的探讨编译过程的文章,只是我对这个问题了解过程的一个梳理。 1.1 预处理(preprocessing) 在预处理阶段,我们可以简单理解就是处理以"#"开始的那些预处理指令,比如说:

工具导航Map