hello程序的生命周期从源程序(hello.c ) (称为高级c语言)开始,然后由其他程序转换为一系列低级机器语言指令。 这些指令以称为可执行对象程序的格式打包,并存储为二进制磁盘文件。
示例: unix gcc -o hello hello.c可以实现从源文件到目标文件的转换。 这个过程由编译器完成。
hello.c—- hello.I—- hello.s—- hello.o—hello
举个简单的例子,例子称为Base.c,内容如下。
#include stdio.h
/这是评论/
int main () )。
printf(「Helloworld(n ) “;
返回0;
}
(1)预处理(cpp )预处理器有多个,而C/C预处理器是最底层的——词法预处理器,主要进行文本替换、宏展开、注释删除等简单工作。
gcc -E选项可以得到预处理后的结果,扩展名为. I;
C/C预处理不执行任何语法检查,不仅是因为不具有语法检查功能,而且预处理指令不属于C/C语句。 (这也是在定义宏时不要附加点。 )
预处理后,得到的只有真正的源代码;
GCC确实很强大,像VC这样的IDE可能看不到预处理后的结果。
预处理e.g .是指展开程序中的宏,展开并包含头文件的内容。 预处理不会生成文件,所以需要重定向
(2)编译器) ccl ) :将文本文件. I翻译成文本文件. s,得到汇编语言程序(将高级语言翻译成机器语言)。 这个语言程序的各个句子以标准的文本形式正确地记述了低级的机器语言命令。
gcc -S选项可以获取编译的汇编代码,扩展名为. s;
汇编语言为各种高级语言的各种编译器提供了通用的输出语言。 例如,c编译器和Fortran编译器生成的输出文件使用相同的汇编语言。
电音。
(3)汇编) as ) :将. s翻译成机器语言指令,将这些指令打包成称为可重定位目标程序的格式,并将结果保存在目标文件. o中(将汇编语言翻译成机器语言的过程)。
在gcc -c选项中,扩展名为. o;
. o是二进制文件,字节码是机器语言指令而不是字符。 在文本编辑器中打开. o文件时,可以看到乱码堆。
将一个源程序翻译成目标程序的工作过程分为五个阶段。 词法分析; 语法分析; 语义检查和中间代码生成; 代码优化; 目标代码生成。 主要进行词法分析和语法分析,也称为源程序分析,分析过程中会发现语法错误,并给出提示信息。
电音。
)4)链接) ld ):gcc在系统默认搜索路径(/usr/lib )下进行搜索。 也就是说,链接到libc.so.6库函数。 包装器一般分为静态库和动态库两种。 静态库是指在编译链接时,将库文件的所有代码添加到可执行文件中。 因此,生成的文件会很大,但运行时不需要库文件。 扩展名一般为“. a”。 与动态库相反,通过在程序运行时从运行时链接文件加载库,而不是在编译链接时将库文件的代码添加到可执行文件中,可以节省系统开销。 动态库的扩展名为“. so”,如上所述,libc.so.6为动态库。 gcc在编译时默认使用动态库。
3359 blog.csdn.net/ken eyr/article/details/87277585
168飞艇最强技巧扩展名为. o;
. o是二进制文件,字节码是机器语言指令而不是字符。 在文本编辑器中打开. o文件时,可以看到乱码堆。
将一个源程序翻译成目标程序的工作过程分为五个阶段。 词法分析; 语法分析; 语义检查和中间代码生成; 代码优化; 目标代码生成。 主要进行词法分析和语法分析,也称为源程序分析,分析过程中会发现语法错误,并给出提示信息。
电音。
)4)链接) ld ):gcc在系统默认搜索路径(/usr/lib )下进行搜索。 也就是说,链接到libc.so.6库函数。 包装器一般分为静态库和动态库两种。 静态库是指在编译链接时,将库文件的所有代码添加到可执行文件中。 因此,生成的文件会很大,但运行时不需要库文件。 扩展名一般为“. a”。 与动态库相反,通过在程序运行时从运行时链接文件加载库,而不是在编译链接时将库文件的代码添加到可执行文件中,可以节省系统开销。 动态库的扩展名为“. so”,如上所述,libc.so.6为动态库。 gcc在编译时默认使用动态库。
3359 blog.csdn.net/ken eyr/article/details/87277585