1.gcc安装
命令:$sudo apt install gcc
2.gcc分布编译
为四个过程:预处理(预编译),编译,汇编,链接。(详细内容请看 6.编译和链接)
(1)预编译(-E(大写):预处理指定的源文件,但是不进行编译)
$gcc -E main.c -o main.i
(2)编译(-S(大写):编译执行的源文件,但是不进行汇编)
$gcc -S main.i -o main.s
(3)汇编(-c(小写):编译,汇编指定的源文件,但是不进行链接)
$gcc -c main.s -o main.o
(4)链接(-o:指定生成文件的文件名)
$gcc main.o -o main
3.gcc一步编译
命令如下: $gcc main.c
如果不给-o,系统会默认生成可执行文件a.out,如果想自定义最终生成的可执行文件的文件名,可以通 过-o: gcc main.c -o main
前三个步骤,可通过一行代码,直接将源文件变成目标文件“.o”:
$gcc -c main.c
4.编译后执行
在Linux中,通过路径+文件名的方式可以启动一个程序,这里的"./"可不 可以省略。
不加路径的话,系统将其看做一个命令, 而且并不是在我当前相对目录下找main或者a.out,而是默认直接去标准路径下找main和a.out,当然 找不到的话,就会报错,说在/usr/bin里面找不到对应的命令。
怎样像pwd,ls这些命令一样,不需要路径就可以执行呢?
可以将我们刚才生成的main和a.out放到/usr/bin里面,则这时 系统就可以找到了,就不会报错了,就可以像pwd,ls这些命令一样, 不需要路径也可以执行了。
5.编译链接过程
6 .编译和链接的详细内容
6.1 预编译
首先是源代码文件“hello.c”和相关头文件,如stdio.h等被预编译器cpp预编译成一个“.i”文件。
命令:$gcc -E main.c -o main.i (-E只能进行预编译)。
预编译过程主要处理源代码文件中的以“#”开头的预编译指令,比如“#include”,“#define”等,
主要的处理规则如下:
(1)将所有“#define”删除,并且展开所有的宏定义。
(2)处理所有条件预编译指令,如“#if”,"#ifdef",“#else”
(3)处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。
(4)删除所有注释
(5)添加行号和文件名标识
(6)保留所有#pragma编译器指令
6.2 编译
编译过程就是将预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生产相应的汇编代码文件。
命令:$gcc -S main.i -o main.s
现在版本的GCC把预编译和编译两个步骤合并成为一个步骤,使用一个叫做cc1的程序来完成这两个步骤。实际上,gcc这个命令只是这些后台程序的包装,它会根据不同的参数去要求去调用预编译编译程序cc1、汇编器as、链接器ld。
编译过程一般分为6步:扫描、语法分析、语义分析、源代码优化、代码生成和目标代码优化。
6.3汇编
汇编器是将汇编代码转变成机器可以执行的指令
命令:$gcc -c main.s -o main.o
或者 : $as main.s -o main.o
或者使用gcc命令从C源代码文件开始,经过预编译、编译和汇编直接输出目标文件
$gcc -c main.c -o main.o
6.4链接
链接的主要内容就是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地衔接。
命令:$gcc main.o -o main
链接过程主要包括地址和空间分配、符号决议和重定位等这些步骤
注:该内容来自《程序员的自我修养——链接、装载与库》 第二章编译和链接
版权归原作者 等一下,我还可以学 所有, 如有侵权,请联系我们删除。