Linux操作系统下对c语言程序的编译和执行过程gcc,编译链接过程

目录

1.gcc,g++,gdb安装

2.gcc分布编译链接

3.编译链接过程

4.执行

4.1 如何执行

4.2 两步执行与一步执行

4.3 多文件的编译执行


1.gcc,g++,gdb安装

命令行写gcc,g++,gdb根据提示安装:sudo apt install gcc/g++/gdb

2.gcc分布编译链接

(1)预编译:
gcc -E main.c -o main.i
(2)编译:
gcc -S main.i -o main.s
(3)汇编:
gcc -c main.s -o main.o
(4)链接
gcc main.o -o main
执行: ./main
或者:全路径/main

3.编译链接过程

编译链接原理:
main.c通过预编译生成main.i文件
main.i通过编译生成main.s文件
main.s通过汇编生成main.o文件(可重定位的二进制目标文件)
链接阶段就是将所有的.o文件, .a文件(静态库文件), .lib文件, .obj文件链接起来,生成.out文件(ELF格式的可执行文件) (Windows是生成.exe文件)
预编译生成.i文件(第一步),编译生成.s文件(第二步),即编译生成汇编指令,然后接下来
**当然就是汇编了,对汇编指令进行汇编,生成.o文件(第(3)步),即变成二进制指令(第(3)
步),最后就是链接了(第四步)**

参考书目及拓展:程序员的自我修养     2.1章  37页

(1)预编译阶段
a)删除所有的"#define",并且展开所有的宏定义;
b)处理所有的条件预编译指令,"#if","#ifdef","#endif"等;
c)处理"#include"预编译指令,将被包含的文件插入到该预编译指令的位置;
d)删除所有的注释;

e)添加行号和文件名标识,以便于编译器产生调试用的符号信息及编译时产生编译错
误和警告时显示行号;
f)保留所有的#pragma编译器指令,因为编译器需要使用它们;

(2)编译阶段
词法分析,语法分析,语义分析,代码优化,汇总符号

(3)汇编阶段:
将汇编指令翻译成二进制格式,生成各个section,生成符号表.
(4)链接阶段
1)合并各个section,调整section的起始位移和段大小,合并符号表,进行符号解析,给符号分配虚拟地址;
2)符号重定位,即在使用符号的地方全部替换成符号的虚拟地址;

4.执行

4.1 如何执行

路径+可执行文件名
或者
路径+可执行文件名 & (将进程放到后台执行);

可以把可执行文件放到 /usr/bin 就可以省略路径了;

思考:为什么?

ps :/usr/bin ps,ls,pwd 

4.2 两步执行与一步执行

1.两步执行

可以三步合为一步,即不经过预编译,编译,汇编三步,直接一步生成.o文件:

  • gcc -c main.c -o main.o 或者 gcc -c main.c
  • gcc -o main main.o 或者gcc -o main main.c

gcc -c main.c(只编译,看有没有语法错误);工作中常用

2.一步执行

可以四步合为一步:
gcc -o main main.c

/.main:查看程序运行结果

4.3 多文件的编译执行

先写如下三个文件:
add.c max.c main.c

//add.h
int add(int x,int y);

//add.c
int add(int x,int y)
{
    return x+y;
} 

//max.h
int max(int x,int y);

//max.c
int max(int x,int y)
{
     return x>y?x:y;
} 


//main.c
#include <stdio.h>
#include "./max.h"
#include "./add.h"
int main()
{
    int a=10;
    int b=20;
    printf("a+b=%d\n",add(10,20));
    printf("a,b的最大值为%d\n",max(10,20));
    return 0;
}

如何执行呢?

错误做法:gcc  -o main main.c (error)

正确做法:

两步执行:

gcc  -c  main.c

gcc  -o main main.c  add.c  max.c

一步执行:

gcc  -o main main.c  add.c  max.c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值