Linux:gcc的基本知识

gcc 是一个将C语言文件变成可执行文件的工具。

在Linux中,如果需要将一个C语言文件变得可以执行,那么除了这个文件本身的内容是C语言编写的内容外,还需要gcc这个编译工具进行编译才行。

复制代码
gcc 使用的格式方法:
 
 gcc  要编译的文件 
 
//在该代码下,gcc默认会将编译后的可执行文件改名为 a.out 
 
//但是这种编译方式是最新版本的,老版本可能不支持,所以在编译的过程中需要一点改变
 
gcc  需要编译的文件 -std=c99
 
//而若想要换一个名字,使得编译出的文件不在是a.out 则需要使用以下代码
 
gcc 需要编译的文件 -o 新名字 -std=c99 
 
//或是
 
gcc -o 新名字 需要编译的文件 -std=c99

另外,用于编译c++的g++命令也可以编译C语言,且g++编译c++的方法和gcc编译C语言的方法大致相同,但不同的是gcc并不能编译c++


gcc的翻译(编译)过程:

预处理(Pre-Processing):这个阶段主要处理源文件中的#indef、#include和#define预处理命令;这里主要是把一些include的头文件和一些宏定义,放到源文件中。

  • 输入的是C语言的源文件
  • 输出 :生成一个中间/预加载文件 *.i(以 .i 结尾的文件)
  • 这个阶段对应的gcc命令如下:#gcc --E(预处理) test.c(源文件) -o test.i(将结果生成的文件)
  • 说明:它通过对源文件test.c使用E选项来生成中间文件test.i

汇编(Assembling)

  • 输入:中间文件*.i

  • 输出:编译后生成汇编编语言文件*.s

  • 这个阶段对应的gcc命令如下:
    #gcc -S(汇编) test.i -o test.s(汇编编语言文件)

  • 说明:它通过对源文件test.c使用S选项来生成汇编文件test.s

编译(Compiling)

  • 输入文件:汇编文件*.s
  • 输出文件:二进制机器代码*.o
  • 这个阶段对应的gcc命令如下:#gcc -c(编译) test.s -o test.o

* gcc -c

在功能上,预处理、编译、汇编是3个不同的阶段

但gcc在实际操作时可以把这3个步骤合并为一个步骤来执行,即使用 -c选项:

  • 输入文件:源码*.c文件
  • 输出文件:二进制机器代码*.o
  • 这个阶段对应的gcc命令如下:

    gcc --c test.c -o test.o

    // -o指定了output_filename

链接(Linking)

  • 输入文件:二进制机器码*.o文件
  • 输出文件:与其它的机器代码和库文件汇集成一个可执行的二进制代码文件(无后缀)
  • 这个阶段对应的gcc命令如下:
    #gcc (没有选项符号) test.o example.o -o test

什么是链接?

链接是库和程序的结合,当一个语言被发明的时候是有一套标准的,而这个库也就表示着语言的标准库。

当然,库也分类,在Linux中分为两种,第一种是动态库,通常以.so为后缀,且链接一般默认使用的库就是动态库,而另一种是静态库,是以.a为后缀的,并且在Linux中默认是没有静态库的存在,所以需要自己安装。

安装静态库:
复制代码
sudo yum install -y glibc-static libstdc++-static
静态库的使用:
复制代码
gcc -o  指定名字  链接的文件  -static
优缺对比:
  • C动态库,默认提供的
  • gcc默认形成的可执行程序,默认采用动态链接

动态库&&动态链接的优缺点:

  1. 不能丢失
  2. 节省资源

静态库&&静态链接的优缺点:

  1. 一旦形成,和库无关
  2. 浪费资源
相关推荐
撬动未来的支点9 分钟前
【Linux内核】Linux系统启动之旅
linux
wadesir15 分钟前
云服务器与传统服务器租用的核心差异解析(云服务器与服务器租用之间的区别在哪里?)
运维·服务器
凯子坚持 c16 分钟前
Docker 深度解析:从虚拟化到新一代应用构建、运行与交付
运维·docker·容器
风吹落叶花飘荡18 分钟前
启用服务器登录失败处理与超时自动退出功能
运维·服务器
乌萨奇也要立志学C++1 小时前
【Linux】基础IO(一)Linux 文件操作从入门到实践:系统调用、文件描述符、重定向,为自定义Shell添加重定向
linux·运维·chrome
liujing102329295 小时前
stm32大项目阶段20251015
linux
嵌入式郑工6 小时前
LINUX驱动开发: 设备和驱动是怎么匹配的?
linux·运维·服务器
rain bye bye7 小时前
calibre LVS 跑不起来 就将setup 的LVS Option connect下的 connect all nets by name 打开。
服务器·数据库·lvs
郭式云源生法则7 小时前
归档及压缩、重定向与管道操作和综合使用,find精确查找、find处理查找结果、vim高级使用、vimdiff多文件使用
linux·运维·服务器
一张假钞8 小时前
Ubuntu 24.04 安装 Jenkins
linux·ci/cd·jenkins