Linux中的编译与链接

本文详细介绍了Linux环境下使用gcc进行编译链接的过程,包括安装gcc/g++、编译链接的四个步骤(预编译、编译、汇编、链接)、执行可执行文件的方法以及多源文件的处理。同时,解释了预编译、编译、汇编和链接阶段各自的任务,并提到了一步执行和使用makefile管理多源文件的方式。此外,还讨论了gcc和g++的区别以及g++链接C++标准库的选项。
摘要由CSDN通过智能技术生成

Linux中编译链接
1.安装gcc,g++
sudo apt install gcc
sudo apt install g++S
apt update 更新软件源
2.编译链接的四个步骤

1)预编译 main.c ——> main.i

语法:gcc -E main.c -o main.i

gcc -o main.i -E main.c

2)编译 main.i ——> main.s

语法:gcc -S main.i -o main.s

3)汇编 main.s ——> main.o

语法:gcc -c main.s -o main.o

4)链接 main.o ——> main(可执行文件)

语法:gcc main.o -o main

在这里插入图片描述

5)执行

./main

或者 全路径/main (路径+可执行文件名)
在这里插入图片描述

3.编译链接的过程

在这里插入图片描述

main.c文件通过预编译生成main.i文件

main.i文件通过编译生成main.s文件

main.s文件通过汇编生成 main.o文件

链接阶段:将所有的 .o .a(静态库文件) .lib(库文件) .obj文件链接起来生成 .out 文件。

ELF格式的可执行文件 .out文件(Windows生成的是.exe文件)

4.各个阶段所做的事情
1)预编译阶段:

#pragma 用于指示编译器完成一些特定的动作

#pragma once 在头文件的最开始加入,保证头文件只能被编译一次

a)删除所有的"#define",并展开所有的宏定义;

b)处理所有的条件预编译指令,“#if”,“ifdef”,"endif"等;

c)处理"#include"预编译指令,将被包含的文件插入到该预编译指令的位置;

d)删除所有的注释;

e)添加行号和文件名标识,以便于编译器产生调试用的符号信息以及编译时产生的错误和警告时显示行号;

f)保留所有的#pragma编译器指令,因为编译器需要使用它们。

2)编译阶段:

词法分析,语法分析,语义分析,代码优化,汇总符号。

3)汇编阶段:

将汇编指令翻译成二进制格式,生成各个section,生成符号表。

4)链接阶段:

a)合并各个section,调整各个section的起始位置的端的大小,合并符号表,进行符号解析,给符号分配虚拟地址。

b)符号重定位:即在使用符号的全部地方全部替换成符号的虚拟地址。

5.关于执行

如何启动一个进程?

路径+可执行文件名

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

可以把可执行文件放到/user/bin目录下,就可以省略路径。

6.关于一步执行

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

gcc -c main.c -o main.o
//gcc -c main.c(先编译查看是否有错误)

gcc -o main main.o

在这里插入图片描述

2)可以四步合为一步:

gcc -o main main.c

在这里插入图片描述

7.关于多个源文件???(已解决见makefile和make)

1)两步,先分步再合并

gcc -c main.c

gcc -c add.c

gcc -c max.c

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

2)一步完成

gcc -o main main.c add.c max.c
8.g++

gcc可以编译C、C++文件,两者均可。(一般默认只连接C库)

gcc -o mainc++ mainc++.cpp(默认链接C库)

gcc -o mainc++ mainc++.cpp -lstdc++(指明用C++的标准库)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值