Linux笔记--GCC

GCC编译器是Linux系统下最常用的CIC++编译器,大部分Linux发行版中都会默认安装。GCC编译器通常以gcc指令的形式在终端中使用。

一.gcc指令

1.直接编译

创建a.c文件

cpp 复制代码
#使用gcc对程序进行编译,默认得到可执行文件的文件名为a.out
gcc [文件名].c
gcc a.c
./a.out

2.分步编译

-o:重命名.out文件,默认是a.out

cpp 复制代码
#预处理
--对.c程序文件进行预处理得到.i预处理文件
gcc -E[文件名].c -o[文件名].i
gcc -E a.c -o a.i

#编译
--通过编译得到.s汇编文件(如果操作对象是.c文件,会进行预处理+编译)
gcc -S [文件名].i
gcc -S a.i

#汇编
--通过汇编得到 hello.o机器码文件(如果操作对象是.c文件,会进行预处理+编译+汇编;如果操作对象是.i文件?)
gcc -c[文件名].s
gcc -c a.s

#链接
--通过链接得到a.out可执行文件(如果操作对象是.c文件,进行完整编译步骤)
gcc [文件名].o
gcc a.o -o a

二、编译步骤

从hello.c到hello (或a.out)文件,必须历经hello.i、hello.s、hello.o、hello (或a.out))文件,分别对应着预处理、编译、汇编和链接4个步骤,整个过程如图所示:

  • 预处理:通过预处理器处理头文件展开、宏定义扩展等,生成.i文件,还是C代码;
  • 编译:将预处理得到的源代码文件进行语法词法分析,"翻译转换"产生出机器语言的.s文件,得到机器语言的汇编文件;
  • 汇编:将汇编代码翻译成了机器码,得到.o目标文件,但是还不可以运行;
  • 链接:处理可重定位文件,把各种符号引用和符号定义转换成为可执行文件中的合适信息,通常是虚拟地址。

三、目标文件

创建a.c文件,a.c中调用外部函数thanks()

cpp 复制代码
#include<stdio.h>

void print_thank();

int main(int argc,char *argv[])
{
    print_thank();
    printf("Hello World!\n");
    return 0;
}

创建thank.c包含 ptintf_thank()函数

cpp 复制代码
#include<stdio.h>
void print_thank ( ) ;
{
    printf("Thank you\n");
}
复制代码
gcc a.c thank.c
./a.out

当多文件编译时,如果更新了某个文件的内容,需要将文件都重新编译。只需要重新编译二进制.o文件,再重新生成.out文件

复制代码
#修改了thank.c文件
gcc -c thank.c
gcc a.o thank.o
./a.out

目标文件常常按照特定格式来组织,在Linux下,它是ELF格式(Executable LinkableFormat,可执行可链接格式)。

而通常目标文件有三种形式:

  • 可执行目标文件(executable)。即我们通常所认识的,可直接运行的二进制文件。
  • 可重定位目标文件(relocatable)。包含了二进制的代码和数据,可以与其他可重定位目标文件合并,并创建一个可执行目标文件。(.o文件)
  • 共享目标文件(shared object)。它是一种在加载或者运行时进行链接的特殊可重定位目标文件。
相关推荐
甲鱼9296 小时前
MySQL 实战手记:日志管理与主从复制搭建全指南
运维
Johny_Zhao20 小时前
OpenClaw安装部署教程
linux·人工智能·ai·云计算·系统运维·openclaw
tingshuo291721 小时前
S001 【模板】从前缀函数到KMP应用 字符串匹配 字符串周期
笔记
chlk1232 天前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑2 天前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件2 天前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
碳基沙盒2 天前
OpenClaw 多 Agent 配置实战指南
运维
深紫色的三北六号3 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash3 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI3 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github