C/C++从代码到可执行程序
2016-12-13 21:51
169 查看
我们在平时开发中,很少去关注程序是怎么跑起来的,一个简单的helloworld程序是每一个程序猿闭着眼睛就能写出来的,编译运行一气呵成,成为了程序入门和开发环境测试的默认标准
在xcode下我们直接使用command+R运行程序,就可以看见控制台输出hello world.
事实上,上述过程可以分解为4个步骤。分别是预处理、编译、汇编、链接;
重点内容
第一步:预处理:
预处理器主要处理那些源文件代码中的”#”开始的预编译指令,主要规则如下:
–删除所有的”#define”,展开所有的宏定义;
–处理所有的条件预编译指令;如”#if”、”#ifdef”、”#elif”等;
–处理”#include”预编译指令,将被包含的文件插入到预编译指令的位置,注意这个过程是递归进行的,也就是说被包含的文件还有可能包含其他文件;
–删除所有的注释”//”和”/* */”;
–添加行号和文件标示,比如#2 “hello.c” 2,以便于编译时产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号;
–保留所有的#pragram 编译器指令,因为编译器需要使用它们。
我们可以在终端中使用如下命令来只进行预处理过程
$gcc -E hello.c -o hello.i
预处理后的.i文件不包含任何宏定义,我们可以通过查看.i文件来验证上述步骤;
第二步 编译:
编译器主要就是把预处理完的.i文件进行一系列的词法分析、语法分析、语义分析及优化之后生成相应的汇编代码文件,这个过程就是我们所说的程序构建的核心部分,因为涉及到编译原理,相对来说比较复杂,这里我们暂时只要了解这过程就可以了;上述过程相当于如下命令
$gcc -S hello.i -o hello.s
编译之后生成.s文件,我们可以通过查看生成的.s文件验证上述步骤,此时生成的.s文件里存储的为汇编代码
第三步 汇编:
汇编器是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令,所以汇编器的汇编过程相对于编译器来讲比较简单,没有复杂的语法,也没有语义,也不需要指令优化,只是根据汇编指令和机器指令对照表一一翻译就可以了上述过程我们可以使用如下命令完成
$gcc -c hello.s -o hello.o
编译之后生成.o文件,我们可以通过查看生成的.o文件验证上述步骤,此时生成的.o文件存储的为二进制数据
第四部 链接:
每个.c文件经过上述步骤都生成了对应的目标文件(扩展名为.o或.obj),把生成的所有的目标文件组装到一起的过程就是链接。链接主要就是把各个文件之间相互引用的部分处理好,使得各个文件之间能够正确衔接。链接完成之后生成可执行文件a.out(unix下)
#include <stdio.h> int main(int argc,char* argv[]) { printf("hello world\n"); return 0; }
在xcode下我们直接使用command+R运行程序,就可以看见控制台输出hello world.
事实上,上述过程可以分解为4个步骤。分别是预处理、编译、汇编、链接;
重点内容
第一步:预处理:
预处理器主要处理那些源文件代码中的”#”开始的预编译指令,主要规则如下:
–删除所有的”#define”,展开所有的宏定义;
–处理所有的条件预编译指令;如”#if”、”#ifdef”、”#elif”等;
–处理”#include”预编译指令,将被包含的文件插入到预编译指令的位置,注意这个过程是递归进行的,也就是说被包含的文件还有可能包含其他文件;
–删除所有的注释”//”和”/* */”;
–添加行号和文件标示,比如#2 “hello.c” 2,以便于编译时产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号;
–保留所有的#pragram 编译器指令,因为编译器需要使用它们。
我们可以在终端中使用如下命令来只进行预处理过程
$gcc -E hello.c -o hello.i
预处理后的.i文件不包含任何宏定义,我们可以通过查看.i文件来验证上述步骤;
第二步 编译:
编译器主要就是把预处理完的.i文件进行一系列的词法分析、语法分析、语义分析及优化之后生成相应的汇编代码文件,这个过程就是我们所说的程序构建的核心部分,因为涉及到编译原理,相对来说比较复杂,这里我们暂时只要了解这过程就可以了;上述过程相当于如下命令
$gcc -S hello.i -o hello.s
编译之后生成.s文件,我们可以通过查看生成的.s文件验证上述步骤,此时生成的.s文件里存储的为汇编代码
第三步 汇编:
汇编器是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令,所以汇编器的汇编过程相对于编译器来讲比较简单,没有复杂的语法,也没有语义,也不需要指令优化,只是根据汇编指令和机器指令对照表一一翻译就可以了上述过程我们可以使用如下命令完成
$gcc -c hello.s -o hello.o
编译之后生成.o文件,我们可以通过查看生成的.o文件验证上述步骤,此时生成的.o文件存储的为二进制数据
第四部 链接:
每个.c文件经过上述步骤都生成了对应的目标文件(扩展名为.o或.obj),把生成的所有的目标文件组装到一起的过程就是链接。链接主要就是把各个文件之间相互引用的部分处理好,使得各个文件之间能够正确衔接。链接完成之后生成可执行文件a.out(unix下)
--摘自《程序员的自我修养》
相关文章推荐
- C#学习进阶Hello World的17种写法代码分享
- 在js里怎么实现Xcode里的callFuncN方法(详解)
- JSP入门之HelloWorld程序实例
- Android 初识 Helloworld 详解
- Android中利用xml文件布局修改Helloworld程序
- Cocos2d-x学习入门之HelloWorld程序
- C语言之没有main函数的helloworld示例
- Debian配置JDK1.7 与Linux Java Helloworld
- React.js入门实例教程之创建hello world 的5种方式
- xcode中获取js文件的路径方法(推荐)
- J2SE基础之命令行中编写第一个 Hello World
- java 学习笔记(入门篇)_java程序helloWorld
- J2SE基础之在Eclipse中运行hello world
- XCODE Debug模式资料整理
- XCode 加快编译链接速度的方法
- 教你如何解决XCODE升级后插件不能用问题
- 浅谈Xcode 开发工具 XCActionBar
- xcode 4 制作静态库图文详解
- Xcode 升级导致插件失效的解决办法
- Xcode提高开发效率的代码块分享