C从源码到运行发生了哪些事
2017-06-23 11:45
429 查看
一个C/C++程序从源代码到可执行程序主要经历了四个阶段:
①预处理。包括展开宏、处理#include,#if,#ifdef等指令、删除注释、还有一些其他操作。相关命令:gcc -E或cpp
②编译。对预处理文件进行分析并生产汇编代码,主要包括语法分析、语义分析、汇编代码生成、(源/汇编)代码优化。相关命令:gcc -S
③汇编。根据编译产生的汇编代码生成机器指令,过程相当于是根据汇编语法进行翻译。相关命令:gcc -c或as
④链接。用链接器链接程序运行需要的目标文件和库文件,生成可执行文件。链接分为动态链接和静态链接。相关命令gcc或ld
整个过程可以用下面的流程图来表示:
要注意对于静态链接库,在进行链接步骤时,相关实现代码会融合到a.out中;而对动态链接库,在链接时,相当于在程序中进行了标记,并没有把具体实现代码融合进来,所以在程序运行的时候,会调用具体的实现代码。简而言之,静态链接库具有时间优势,而动态链接库具有空间优势。通常会优先考虑用动态链接库。
①预处理。包括展开宏、处理#include,#if,#ifdef等指令、删除注释、还有一些其他操作。相关命令:gcc -E或cpp
②编译。对预处理文件进行分析并生产汇编代码,主要包括语法分析、语义分析、汇编代码生成、(源/汇编)代码优化。相关命令:gcc -S
③汇编。根据编译产生的汇编代码生成机器指令,过程相当于是根据汇编语法进行翻译。相关命令:gcc -c或as
④链接。用链接器链接程序运行需要的目标文件和库文件,生成可执行文件。链接分为动态链接和静态链接。相关命令gcc或ld
整个过程可以用下面的流程图来表示:
要注意对于静态链接库,在进行链接步骤时,相关实现代码会融合到a.out中;而对动态链接库,在链接时,相当于在程序中进行了标记,并没有把具体实现代码融合进来,所以在程序运行的时候,会调用具体的实现代码。简而言之,静态链接库具有时间优势,而动态链接库具有空间优势。通常会优先考虑用动态链接库。
相关文章推荐
- XP操作系统中运行"Start SoftICE"发生: Errror code 31错误解决办法
- (delphi)程序运行过程中等待对话框的自定义组件源码(包含两个提示,进度条,AVI)
- 禁止一个应用程序的实例在同一台机器上运行多个(C#源码)
- 第二人生的源码分析(七十六)判断程序运行多个实例
- (转载)### jar 运行发生ClassNotFound的完整解决方案
- 第二人生的源码分析(七十六)判断程序运行多个实例
- dreamweaver在 ONLOAD运行_onopen.htm时,发生以下javascript错误
- 第二人生的源码分析(四十一)使用Apache运行库线程
- 第二人生的源码分析(四十一)使用Apache运行库线程
- 检测到指定的WEB服务器运行的不是ASP.NET 1.1版,您无法运行ASP.NET应用程序或服务和创建ASP.NET程序时候发生错误 HTTP/1.0 500 Server Error的解决方法
- 如何使用Eclipse导入并运行源码
- VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结
- VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结
- 哪些原因会运行ExecuteReader而抛出"连接被关闭"的异常?
- 在windows2003server上运行asp程序,发生验证码看不到,文件找不到等错误的解决办法
- 6.1---F5运行,可是我们发现这下拉框选择时什么事也没发生的解决
- BPEL实例运行[1]——改写源码
- 将Tomcat6源码转成可运行的Eclipse项目
- jar运行发生ClassNotFound的完整解决方案
- jar 运行发生ClassNotFound的完整解决方案