C文件编译步骤

您所在的位置:网站首页 c如何编译c语言 C文件编译步骤

C文件编译步骤

2023-08-19 13:44| 来源: 网络整理| 查看: 265

C文件编译步骤 四步: 预处理:gcc -E project.c -o project.i //头文件展开,宏替换 ,去掉注释 编译:gcc -S project.i -o project.s //将目标文件编译成汇编文件 汇编:gcc -c project.s -o project.o //汇编成二进制文件 链接:gcc project.o -o project //加载库文件,生成可执行文件 编译c代码用gcc。 g++是专门来编译C++语言。 一步实现 g++ hello.cpp -o hello gcc hello.cpp -o hello

编译 是最花费时间的 gcc常用参数: gcc -v/–version 查看gcc版本 -I:编译时指定头文件路径,当头文件和当前编译的文件不在同一路径下时使用 gcc sum.c -I (./include/xxx文件路径) -o sum -o:指定要生成的文件的名字。 -g:gbd调试的时候需要加 -D:编译时指定一个宏,调试代码的时候使用 -Wall:产生警告信息 -On:优化代码,优化级别:1,2,3(从低到高)

一:预编译(预处理) 预编译(预处理)是预处理中会展开以#起始的行,包括#if、#ifdef、#if ndef、 #else 、 #elif 、 # endif、#define、#include、#line、 #error、#pragma以及单独的#。其实就是把除了函数(包括main)以外的东西都展开成指定的形式,比如加上行号等,并将头文件里包含的东西所对应的文件(包括子文件夹)也都写入进去以便调用。同时也会把写在文件里的注释都删掉。 1)将所有的#define删除,并展开所有的宏定义; 2)处理所有的预编译指令,例如:#if,#elif,#else,#endif; 3)处理#include预编译指令,将被包含的文件插入到预编译指令的位置; 4)添加行号信息文件名信息,便于调试; 5)删除所有的注释:// /**/; 6)保留所有的#pragma编译指令,因为在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作;

最后生成.i文件; 例如:Gcc预处理指令:

gcc -E reverse.c -o reverse.i

-E是仅激活预处理程序,将生成的信息放入reverse.i。如果不写 -o reverse.i 就会生成到终端显示。相当于重定向。 在这里插入图片描述在这里插入图片描述

程序变成了1000多行

二:编译 编译:编译器将c语言程序翻译成汇编语言程序; 1)扫描,语法分析,语义分析,源代码优化,目标代码生成,目标代码优化; 2)生成汇编代码; 3)汇总符号; 4)生成.s文件;

gcc -S reverse.i -o reverse.s

在这里插入图片描述

程序变成了100多行,并且没有了源文件的内容,变成了一条条汇编指令。

三:汇编 汇编语言通过汇编器编译成可重定位目标程序.o,与之相反称为反汇编; 汇编就是把生成的汇编指令逐条翻译成机器可以识别的形式,即机器码,这一步会产生平台相关性,即决定了在哪种平台下运行 1)根据汇编指令和特定平台,把汇编指令翻译成二进制形式; 2)合并各个section,合并符号表; 3)生成.o文件;

gcc -c reverse.s -o reverse.o

此时用了但还有最后一步才能生成可执行文件,reverse.o打开之后是乱码,改成十六进制之后虽然能看清楚是什么数字,但毕竟是二进制,还要进行翻译才能形成汇编指令。可以用vim进行转换。在vim的命令行模式(进入后按Esc后按:进入命令行模式),输入:

vim -b filename //文件名,注意替换 //进入命令行后: :%!xxd //要再输入一个:,一共两个:!

在这里插入图片描述

四:链接 链接:将目标文件和所需的库函数用链接器进行链接,常见的链接器有Unix; 1)合并各个.obj文件的section,合并符号表,进行符号解析; 2)符号地址重定位; 3)生成可执行文件;

gcc reverse.o -o reverse ./reverse

参考:https://blog.csdn.net/qq_31811537/article/details/79312908



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3