首页 > 系统相关 >【Linux】GCC编译器(七)

【Linux】GCC编译器(七)

时间:2024-04-04 22:59:08浏览次数:36  
标签:选项 GCC 生成 编译 编译器 Linux world 源代码

文章目录

初步了解

  1. GCC是GNU Compiler Collection的缩写,是一个由GNU项目开发的编译器集合。

  2. GCC的历史和发展:GCC最初由理查德·斯托曼(Richard Stallman)发起,目的是创建一个自由的Unix操作系统。1987年,GCC首次发布,它最初只能编译C语言。随后,GCC迅速发展,逐渐添加了对其他编程语言的支持,并成为了许多操作系统的标准编译器。目前,GCC已经成为了一个功能强大的编译器集合,支持多种语言,并且在开源社区中得到了广泛应用和贡献。

  3. GCC的主要组件和功能:GCC由多个组件组成,其中最重要的包括:

    • 前端(Frontend):负责将源代码转换为中间表示(IR),不同的前端用于处理不同的编程语言,例如C、C++、Objective-C、Fortran、Ada等。
    • 中间层(Middle-end):负责优化中间表示的代码,以提高程序的性能和效率。
    • 后端(Backend):将优化后的中间表示代码转换为目标平台的机器代码。
    • 运行时库(Runtime Libraries):包括各种标准库和运行时支持库,为程序提供所需的功能和支持。
  4. GCC支持的编程语言:GCC是一个多语言编译器集合,它支持多种编程语言,如常见的C、C++、Objective-C、Go等

  5. 为什么学习GCC?

    GCC的通用性使得它在不同的操作系统和平台上都能够使用,包括Linux、Unix、macOS等,这使得开发者可以使用同一套工具在不同的环境下进行开发,提高了开发的效率和一致性。

    其次,作为自由软件,GCC的源代码可以被任何人查看、修改和分享,这使得开发者可以自由地定制和扩展编译器,满足自己特定的需求

    此外,GCC拥有丰富的功能和选项,支持多种编程语言,包括C、C++、Objective-C、Fortran等,可以满足各种不同项目的需求,从小型工具到大型软件项目。

    同时,GCC还提供了强大的优化功能,可以帮助开发者提高程序的性能和效率。

    除此之外,GCC已经成为了许多开发环境和工具链的标准组件,许多集成开发环境(IDE)和构建工具都提供了对GCC的支持,这使得开发者可以更轻松地使用GCC进行开发和构建。

    最后,学习GCC可以帮助开发者更深入地了解编译过程和底层原理,包括预处理、编译、汇编和链接等各个阶段的工作原理,从而提高编程能力和理解能力。

安装 GCC

  1. 安装GCC:如果你使用的是Linux操作系统,通常可以通过系统自带的包管理器来安装GCC。比如,在基于Debian的系统(如Ubuntu)上,你可以使用以下命令来安装GCC:

    sudo apt-get update
    sudo apt-get install gcc
    

    如果你使用的是Windows,你可以考虑使用MinGW等工具来安装GCC。

    Visual Studio Code编辑器也支持GCC。

  2. 确认GCC版本:安装完成后,你可以使用以下命令来确认GCC的版本:

    gcc --version
    

编译第一个程序

#include <stdio.h>
int main() {
    printf("Hello, world!\n");
    return 0;
}

代码编译过程是将源代码转换为可执行程序的过程,通常包括以下几个主要阶段(顺序执行):

  1. 预处理(Preprocessing):在这个阶段,预处理器会处理源代码,执行诸如宏替换、条件编译、删除注释等操作。在这个阶段,#include <stdio.h>会被替换为stdio.h文件中的内容,使得程序能够使用printf等函数。预处理后的代码会直接输入到终端,可以重定向到自定义文件。
  2. 编译(Compilation):在这个阶段,编译器将预处理后的源代码转换为汇编代码(assembly code),生成汇编文件。这个汇编代码是针对特定平台的,并且是与机器无关的中间表示形式。编译之后会生成一个新的文件,通常以.s为扩展名。
  3. 汇编(Assembly):汇编器会将汇编代码转换为目标平台上的机器代码(object code)。汇编器会将汇编指令翻译成二进制形式,生成目标文件(object file),通常以.o.obj为扩展名。
  4. 链接(Linking):在这个阶段,链接器将编译后的目标文件与所需的库文件进行链接,生成最终的可执行文件。例如,printf**函数在标准C库中,链接器会将程序与标准C库进行链接以确保程序可以调用printf函数。

使用vim编辑好以上程序后,即可输入以下命令开始编译:

gcc -o hello_world hello_world.c
./hello_world

这个命令将会编译hello_world.c文件,并生成名为hello_world的可执行文件。运行./hello_world**命令将会执行这个可执行文件,输出Hello, world!到终端上。

gcc没有选项时,会顺序执行上面四个步骤,最后生成一个可执行文件,若是没有指定输出文件名的话,会生成默认的a.out可执行文件。

编译选项

GCC具有许多常用的编译选项,这些选项可以帮助你控制编译过程的行为并优化编译输出。以下是一些常用的编译选项:

  1. 输出选项
    • -E:只进行预处理,生成预处理后的源代码,并直接输出到终端。
    • -S:只进行预处理和编译,生成汇编代码,通常以.s为扩展名。
    • -c:只进行预处理,编译和汇编,生成机器码文件,通常以.o.obj为扩展名。
    • -o <output>:指定输出文件的名称。
  2. 优化选项
    • -O0:关闭优化。
    • -O1:默认值,基本优化,可以提高程序的执行速度和减小程序的体积。
    • -O2:更进一步的优化,会花费更多时间进行编译,但通常会获得更好的性能。
    • -O3:更高级的优化,可能会进行一些更激进的优化,但也可能导致编译时间增加。
  3. 警告选项
    • -Wall:开启所有警告信息。
  4. 调试选项
    • -g:生成调试信息,包括源代码行号和变量信息,以便用于调试器调试程序。
    • -ggdb:生成调试信息,适用于GNU调试器(GDB)。

优化编译输出可以通过调整优化选项来实现。根据需要,你可以根据程序的特性和目标平台选择不同的优化级别。例如,如果你想最大限度地提高程序的性能,可以选择-O3选项。而如果你想在调试阶段获得更好的可读性和可调试性,可以选择使用-g选项生成调试信息。

调试选项可以帮助你在调试程序时更容易地定位问题并理解程序的行为。通过生成调试信息,你可以在调试器中查看源代码行号、变量信息等,从而更轻松地进行调试。

标签:选项,GCC,生成,编译,编译器,Linux,world,源代码
From: https://blog.csdn.net/hdz_wiz_csdn/article/details/137224940

相关文章

  • linux 中 yum makecache 、yum update、yum upgrade的作用
     001、yummakecache的作用是将服务器上的软件包信息缓存到本地,以提高搜索和安装软件的速度。 002、yumupdate:该命令用于更新系统中已安装的软件包到最新版本,但不会安装新的软件包或删除已安装的软件包。 003、yumupgrade:该命令也用于更新系统中已安装的软件包到最新......
  • Linux守护进程之udev-笔记
    一、什么是udev?        udev 是Linux系统中的一个守护进程,它的主要任务是管理所有的设备节点。你可以把它想象成一个设备的“管家”,负责识别、监控和管理连接到计算机上的硬件设备。当一个新设备被连接到系统时,`udev`会立刻识别它,并为其创建相应的文件和目录,这......
  • Linux操作系统之nfs网络文件系统
    目录一、NFS简介1.2安装配置NFS 一、NFS简介nfs类似于windows文件共享将linux的一个目录共享到网络中,网络中的其他所有主机都可以使用这个共享目录中的文件samba文件共享可以在linux中通过samba共享一个目录,然后在linux中可以访问这个共享 nfs网络磁盘可......
  • (通俗易懂)Unix/Linux上的五种IO模型
    接续上一节内容(通俗易懂)阻塞、非阻塞、同步、异步区别-CSDN博客,非常接地气地解释了阻塞、非阻塞、同步、异步的内容。由于内容深度具有延续性,建议看本节内容之前,先过一遍上一节内容噢~由于最近忙于项目,拖了好久才续更这一节内容。本节,我们更深入地探讨一下Unix/Linux上的五种I......
  • Linux——编译链接和gcc
    1.gcc,g++,gdb安装命令行写gcc,g++,gdb根据提示安装:sudoaptinstallgcc/g++/gdb2.gcc分布编译链接(1)预编译:gcc-Emain.c-omain.i(2)编译:gcc-Smain.i-omain.s(3)汇编:gcc-cmain.s-omain.o(4)链接gccmain.o-omain执行:./main或者:全路径/mai......
  • Linux——文件查看命令 文件编辑命令
    文件查看命令(1)cat1)查看文件内容(内容较少时使用):cat文件名2)合并文件:cat文件名1文件名2>文件名33)往文件中写入数据,(Ctrl+d结束输入);(2)moremore文件名文件内容较多时用more(空格,回车往下翻,b回滚)(3)lessless文件名看完内容之后不会显示到屏幕上;(......
  • Linux华为云Hadoop配置环境
    手工搭建Hadoop环境(Linux)_弹性云服务器ECS_最佳实践(huaweicloud.com)https://support.huaweicloud.com/bestpractice-ecs/zh-cn_topic_0000001698668477.html?locale=zh-cn#ZH-CN_TOPIC_0000001698668477__li49001945163110跟着傻瓜式CV即可。气死我了!找了半天,最后在官网......
  • Linux常用命令
    Linux常用命令本文记录了常用命令的详细解读。列出当前目录ls列出详细信息,可以查看文件和文件夹到权限ls-al给文件和文件夹授权sudochmod-R777dataset创建文件夹mkdir复制文件夹(递归)cp-r通过SSH复制到远程服务器scp-r在linux下一般用scp这个命令来......
  • Linux项目自动化构建工具 --- make/Makefile
    文章目录make/Makefile文件1背景2理解2.1创建执行代码2.2创建makefile文件2.3运行make指令2.3.1依赖关系2.3.2依赖方法2.3.3原理2.4项目清理make/Makefile文件1背景会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文......
  • 【Linux】网络基础常识
    文章目录1.网络常识1.0dhcp协议1.1ip地址,mac地址是什么?1.2你拿着手机是如何连接上wifi的?1.3数据,流量是什么?手机如何通过“数据/流量”上网?1.4电脑连接wifi的原理?电脑通过热点上网的原理?1.5固定电话打电话的原理?智能手机打手机电话/语音电话/视频电话的原理?1.62g,5g有什......