Linux:GCC安装与编译(详细)

目录

1.gcc安装

2.gcc分布编译

(1)预编译(-E(大写):预处理指定的源文件,但是不进行编译)

(2)编译(-S(大写):编译执行的源文件,但是不进行汇编)

(3)汇编(-c(小写):编译,汇编指定的源文件,但是不进行链接)

(4)链接(-o:指定生成文件的文件名)

3.gcc一步编译

 4.编译后执行

 5.编译链接过程

6 .编译和链接的详细内容

6.1 预编译

6.2 编译

6.3汇编

6.4链接


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

链接过程主要包括地址和空间分配、符号决议和重定位等这些步骤

:该内容来自《程序员的自我修养——链接、装载与库》 第二章编译和链接

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值