gcc原理和使用

news2024/12/24 20:41:33

gcc

gcc是什么

GCC,全称 GNU Compiler Collection(GNU 编译器套件),是一套功能强大的编程语言编译器,由自由软件基金会(Free Software Foundation, FSF)作为GNU项目的一部分开发和维护。它最初被创建为一个C语言编译器,后来扩展支持了C++,以及随着时间的推移增加了对其他编程语言的支持,如Fortran、Ada、Java、Go和Rust等。

主要特点与功能

  1. 多语言支持

    • GCC最初是作为C编译器开发的,因此得名GNU C Compiler。
    • 随后增加了对C++(称为G++)、Fortran、Ada等多种语言的支持。
  2. 跨平台编译

    • GCC可以用于多种操作系统平台,包括Linux、Windows、macOS等。
    • 它能够生成跨平台的代码,使得编写的程序能在不同的系统架构上运行。
  3. 优化能力

    • 提供多种级别的优化选项,帮助开发者提升程序的执行效率。
    • 优化选项包括但不限于代码大小优化、执行速度优化等。
  4. 标准遵循与兼容性

    • GCC严格遵循各种编程语言的标准,例如ISO C++和ISO C标准。
    • 不断更新以支持最新的语言标凈。
  5. 调试和错误报告

    • 提供详细的错误和警告信息,帮助开发者快速定位问题。
    • 与GDB(GNU Debugger)等调试工具配合良好,提供强大的调试支持。
  6. 可扩展性

    • 开放源代码,允许开发者自定义或扩展编译器的功能。
    • 支持插件,可用于增强编译过程或添加新的功能。

应用场景

GCC广泛应用于软件开发和系统编程领域,特别是在开源项目和Linux系统开发中。它是许多Linux发行版默认的编译器,用于编译Linux内核、GNU操作系统和其他大量的应用程序。

安装与使用

  • 在Linux系统中,GCC通常可以通过包管理器(如apt、yum等)安装。
  • 在Windows上,GCC可以通过MinGW(Minimalist GNU for Windows)或Cygwin等工具获得。
  • 在macOS上,可以通过Homebrew或Xcode的命令行工具来安装GCC。

GCC不仅仅是一个编译器,它还是一个强大的工具,对于软件开发和计算机科学教育来说至关重要。由于其开源和免费的特性,GCC对编程社区的贡献不可估量,是推动软件创新和教育普及的重要工具。

c11需要gcc版本 > 4.8.5

查看版本

gcc -v
image-20240417191223707

gcc工作流程

image-20240417191520664

GCC(GNU Compiler Collection)的工作流程涵盖了将源代码转换为可执行文件的多个阶段。这些阶段依次是预处理、编译、汇编和链接,每个阶段都承担着特定的任务,共同完成从源代码到可执行程序的转换。

  1. 预处理阶段(Preprocessing)
  • 任务:预处理器处理源代码文件中以#开头的指令。这包括宏定义的展开、文件包含指令的处理(如#include)、条件编译指令(如#ifdef, #ifndef, #endif)的处理等。
  • 结果:输出的结果是“展开”的源代码,已经插入了所有包含的文件内容,展开了所有宏定义,移除了所有条件不满足的代码块,此外还处理了编译器指令和特定的注释等。
  1. 编译阶段(Compilation)
  • 任务:编译器将预处理后的源代码转换成汇编语言。在这个阶段,编译器进行词法分析、语法分析、语义分析和优化。编译器检查代码的语法错误,分析变量和函数的使用情况,以及执行代码优化以提高程序的运行效率和减少内存占用。
  • 结果:生成的是汇编语言代码,对应于平台的机器指令集。
  1. 汇编阶段(Assembly)
  • 任务:汇编器将汇编语言转换为机器语言,生成目标代码。汇编语言是一种低级语言,比源代码更接近于机器代码,但仍然是人类可读的格式。
  • 结果:输出的是目标文件(通常是.o.obj文件),这些文件包含了机器语言代码但尚未解析外部引用。
  1. 链接阶段(Linking)
  • 任务:链接器处理一个或多个目标文件,并将它们与库(可能是动态的或静态的)合并,解析外部引用,生成最终的可执行文件。在这个阶段,链接器也处理符号解析、地址和偏移量分配等任务。
  • 结果:生成的是可执行文件(在Unix-like系统中通常无扩展名,在Windows中为.exe文件),这些文件包含了可以被操作系统载入内存并执行的所有机器指令。

示例

假设你有一个名为hello.c的C语言程序,整个GCC编译和链接的命令行可以简化为:

gcc -o hello hello.c

这条命令会自动执行上述所有阶段,从hello.c生成可执行文件hello。如果你想观察或控制中间过程,可以使用额外的GCC选项来单独执行各个阶段,例如:

gcc -E hello.c -o hello.i   # 只运行预处理,输出预处理后的文件hello.i
gcc -S hello.c              # 生成汇编代码hello.s
gcc -c hello.c              # 生成目标文件hello.o
gcc hello.o -o hello        # 将目标文件链接成最终的可执行文件

GCC的这种工作流程允许开发者对编译过程有更细致的控制,同时也支持跨平台开发,因为GCC可用于多种操作系统平台上。

gcc常用参数选项

GCC(GNU Compiler Collection)提供了许多命令行参数,这些参数允许开发者定制编译过程、优化生成的代码、指定特定的编译器行为等。下面列出了一些GCC中最常用的参数选项:

基本编译选项

  • -c

    • 编译源代码到目标文件,不进行链接。
    • 例如:gcc -c program.c 生成 program.o
  • -o output

    • 指定生成的输出文件的名称。
    • 例如:gcc program.c -o program 生成一个名为 program 的可执行文件。
  • -g

    • 生成调试信息,方便使用GDB等调试工具进行调试。
    • 例如:gcc -g program.c -o program

优化选项

  • -O, -O1, -O2, -O3

    • 设置优化级别:
      • -O0(默认):不进行优化。
      • -O1:进行基本优化。
      • -O2:进行进一步优化,包括增加编译时间的优化。
      • -O3:启用更多的优化,包括 -O2 所有的优化以及一些额外的优化来提升性能。
    • 例如:gcc -O2 program.c -o program
  • -Os

    • 优化生成的代码,使其占用的空间尽可能小。
    • 例如:gcc -Os program.c -o program

警告控制选项

  • -Wall

    • 开启几乎所有的警告信息。
    • 例如:gcc -Wall program.c -o program
  • -Wextra

    • 开启额外的警告信息,比 -Wall 更严格。
    • 例如:gcc -Wall -Wextra program.c -o program

链接选项

  • -l

    • 链接时指定库名。
    • 例如:gcc program.c -lm -o program 链接数学库 libm
  • -L

    • 指定库文件搜索路径。
    • 例如:gcc program.c -L/home/user/mylibs -lm -o program

预处理选项

  • -Dmacro

    • 定义宏。
    • 例如:gcc -DDEBUG program.c -o program 在编译时定义 DEBUG 宏。
  • -I

    • 指定包含文件(头文件)的搜索路径。
    • 例如:gcc -I/home/user/myheaders program.c -o program

其他有用的选项

  • -std=cXX

    • 指定使用特定的C语言标准进行编译,如 c99c11c17 等。
    • 例如:gcc -std=c11 program.c -o program 使用C11标准编译。
  • -pedantic

    • 要求GCC严格遵守ISO C和ISO C++标准,禁用非标准扩展。
    • 例如:gcc -pedantic program.c -o program
  • -s

    • 在生成最终的可执行文件时去除所有符号信息,用于减少可执行文件的大小。
    • 例如:gcc -s program.c -o program

这些选项只是GCC提供的众多参数中的一部分,但它们是最常用的一些,覆盖了大部分常规需求。你可以结合使用这些选项来控制GCC的行为,优化程序的性能,或者调整程序的编译过程。要了解更多详细的编译选项,可以查阅GCC官方文档或使用 man gcc 命令获取帮助。

image-20240417192648646 image-20240417200507644
gcc test.c -E -o test.i
#include <stdio.h>


int main() {
    int a = 10;
#ifdef DEBUG
    printf("我是一个dccc\n");
#endif
    for (int i = 0; i < 3; i++) {
        printf("hello gcc\n");
    }
    return 0;
}
daic@daic:~/Linux/lesson03$ gcc test.c -o test -D DEBUG
daic@daic:~/Linux/lesson03$ ./test 
我是一个dccc
hello gcc
hello gcc
hello gcc
daic@daic:~/Linux/lesson03$ gcc test.c -o test -D DEBUG -Wall
test.c: In function ‘main’:
test.c:5:9: warning: unused variable ‘a’ [-Wunused-variable]
     int a = 10;
         ^

gcc和g++区别

GCC(GNU Compiler Collection)包含了多个前端编译器,用于处理不同编程语言的编译任务。gccg++ 是这个集合中最常用的两个命令,它们分别用于编译C和C++程序。虽然这两个工具在很多方面相似,但它们在处理C和C++代码时有一些关键的区别和特定的用法。

1. 基本区别

  • gcc

    • 通常用于编译C程序。
    • 默认情况下,它将用作C编译器。
    • 如果没有特别指定,它将尝试以C语言的标准来编译源代码文件。
  • g++

    • 专门用于编译C++程序。
    • 自动将C++库链接到程序中,包括标准模板库(STL)。
    • 默认情况下,将用作C++编译器。
  1. 链接库的不同
  • 当编译C++程序时,g++ 会自动链接C++标准库(如libstdc++)。这意味着使用g++编译器,用户不需要显式指定运行时库,而使用gcc编译C++程序时,可能需要手动添加 -lstdc++ 选项来链接C++库。
  1. 处理C++的特性
  • g++对C++的支持更全面,包括对模板的处理以及C++的名称修饰(name mangling)。这些特性在用gcc编译C++代码时可能不会完全支持,或者需要额外的参数来正确处理。
  1. 文件扩展名的敏感性
  • gcc根据文件扩展名判断如何编译文件。例如,它会将.c文件视为C程序,.cpp.cc文件视为C++程序。根据文件类型的不同,gcc可能需要指定语言标准来正确编译。
  • g++默认将所有文件视为C++文件,除非另有指定。
  1. 编译C文件的行为
  • 你可以使用g++来编译C文件。在这种情况下,g++将C代码视为C++代码的一部分,这通常是安全的,因为C是C++的一个子集。然而,某些严格的C代码在C++编译器下可能会因为语法或语义差异而出现编译错误。

示例

  • 使用gcc编译C++代码时需要链接C++库:

    gcc some_code.cpp -lstdc++ -o some_code
    
  • 使用g++编译相同的C++代码,不需要手动链接C++库:

    g++ some_code.cpp -o some_code
    

结论

虽然gccg++都是GCC的一部分,并且都可以用来编译C和C++代码,但是它们在默认行为和链接库方面有所不同。一般来说,推荐使用g++编译C++代码,而gcc则用于C代码,这样可以确保编译过程的顺利进行和程序的正确链接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1602326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【文献分享】机器学习 + 分子动力学 + 第一性原理 + 电导率 + 微观结构

​【文献分享】机器学习 分子动力学 第一性原理 电导率 微观结构 分享一篇关于机器学习 分子动力学 第一性原理 电导率 微观结构的文章。 感谢论文的原作者&#xff01; 关键词&#xff1a; 1. Machine learning force field 2. Molecular dynamics 3. Solid state …

刷题日记——质因数的个数

题目 分析&#xff08;从质数的判断角度出发&#xff09;&#xff08;递归&#xff09; 判断n是否是质数需要&#xff1a; 遍历&#xff0c;i从2开始到sqrt(n)&#xff0c;每次判断n是否能整除i&#xff0c;若能则不是质数&#xff0c;若不能则是 思路&#xff1a; 先判断n…

你也许不知道的 Confluence 快捷操作

Confluence 是一种企业知识管理和协作平台&#xff0c;用于创建、共享和组织团队的文档、知识和想法。它支持团队成员进行实时协作、评论和编辑文档&#xff0c;提供了强大的搜索功能&#xff0c;方便用户快速找到需要的信息。 Confluence 快捷键解析&#xff0c;标注了对应的…

SpringBoot多数据源(二)

SpringBoot多数据源AbstractRoutingDataSource&#xff08;二&#xff09; 1.多数据源配置2.多数据源调用流程3.实现 1.多数据源配置 spring-jdbc模块提供AbstractRoutingDataSource,其内部可以包含了多个DataSource&#xff0c; 然后在运行时来动态的访问数据库 2.多数据源…

新型大数据架构之湖仓一体(Lakehouse)架构特性说明——Lakehouse 架构(一)

文章目录 为什么需要新的数据架构&#xff1f;湖仓一体&#xff08;Lakehouse&#xff09;——新的大数据架构模式同时具备数仓与数据湖的优点湖仓一体架构存储层计算层 湖仓一体特性单一存储拥有数据仓库的查询性能存算分离开放式架构支持各种数据源类型支持各种使用方式架构简…

1.总结串口的发送和接收功能使用到的函数2.总结DMA的作用,和DMA+空闲中断的使用方式3.使用PWM+ADC光敏电阻完成光控灯的实验

1.总结串口的发送和接收功能使用到的函数 串口发送函数&#xff1a;HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout) UART_HandleTypeDef *huart&#xff1a;指定要使用的串口 const uint8_t *pData&…

数智时代的AI人才粮仓模型解读白皮书(2024版)

来源&#xff1a;极客邦 自 2023 年上半年起&#xff0c;ChatGPT 等大模型技术蓬勃发展&#xff0c;AI 技术不断突破边界&#xff0c;展现 出惊人的潜力和发展速度。从早期的逻辑推理、专家系统&#xff0c;到如今的深度学习、神经网络&#xff0c; AI 技术显著缩小了科学与实…

宝宝洗衣机买几公斤?四款精心挑选实用婴儿洗衣机推荐

家里有孩子的&#xff0c;条件允许的话&#xff0c;婴儿洗衣机还是非常有必要买的。由于宝宝的年纪还小&#xff0c;使得宝宝的皮肤比较娇嫩&#xff0c;与成人衣物分开洗护&#xff0c;可以为宝宝带来更加健康的生长环境&#xff0c;并且可以避免与大人衣物混洗所带来的细菌的…

线圈、寄存器、存储区代号、功能码 案例说明

线圈和寄存器 表示数据类型 线圈&#xff1a;表示Boolean数据类型 寄存器&#xff1a;表示非Boolean数据类型&#xff0c;用来暂时存放参与运算的数据和运算结果&#xff0c;具有接收数据、存放数据和输出数据的功能。 ModbusRTU 读输出线圈 存储区代号 0区 功能码 0x01 读输入…

【过程11】——教育被点燃的路上

这里写目录标题 一、背景二、过程1.两年四十万的认知改变2.三年打工仔的经历改变3.一年计算机的人生蜕变4.后面的展望 三、总结 一、背景 人生在世&#xff0c;对于一些事情的笃信笃行&#xff1b;背后真的会有莫大无以言表的波涛。 这个事情到现在已经五年半左右时间了&#…

数据的插入、修改和删除

一、 插入数据 1. 向表中所有字段插入数据 &#xff08;1&#xff09; 指定所有字段及其相对应的值 insert into 表名(字段1&#xff0c;字段2&#xff0c;……) values(字段值1&#xff0c;字段值2&#xff0c;……);**【案例】**向goods表中插入一条新记录 步骤1&#xff…

C语言【数组】

一、数组基本语法 1. 什么是数组 数组是c语言的一种数据结构&#xff0c;用于存储一组具有相同数据类型的数据&#xff1b; 数组中每个元素可以通过下标进行访问&#xff0c;索引从0开始&#xff0c;最大值为数组长度-1。 2. 数组的使用 类型 数组名[元素个数]; int arr[5]…

网络基础-TCP/IP和OSI协议模型

一、OSI和TCP/IP模型 二、OSI七层模型 三、TCP/IP模型 参考&#xff1a;https://www.cnblogs.com/f-ck-need-u/p/7623252.html

JS-42-Node.js01-Node.js介绍

一、浏览器大战 众所周知&#xff0c;在Netscape设计出JavaScript后的短短几个月&#xff0c;JavaScript事实上已经是前端开发的唯一标准。 后来&#xff0c;微软通过IE击败了Netscape后一统桌面&#xff0c;结果几年时间&#xff0c;浏览器毫无进步。&#xff08;2001年推出…

最优贸易题解

图论学习总结-CSDN博客https://blog.csdn.net/smile__everydays/article/details/137881868?spm1001.2014.3001.5501点击上面连接根据目录即可找到最优贸易的题解

Python文件操作大全

1 文件操作 1.1 文件打开与关闭 1.1.1 打开文件 在Python中&#xff0c;你可以使用 open() 函数来打开文件。以下是一个简单的例子&#xff1a; # 打开文件&#xff08;默认为只读模式&#xff09; file_path example.txt with open(file_path, r) as file:# 执行文件操作…

系统代理与全局代理服务器的区别

系统代理与全局代理服务器的区别 嘿&#xff0c;朋友们&#xff01;今天我来给大家讲解一下系统代理与全局代理服务器的区别。你知道吗&#xff1f;在我们使用互联网的时候&#xff0c;经常需要通过代理服务器来隐藏我们的真实网络身份。那么系统代理和全局代理服务器到底有什…

XXL-JOB v2.4.1 版本正式发布!

v2.4.1 Release Notes 1、【优化】多个项目依赖升级至较新稳定版本&#xff0c;涉及 netty、groovy、springboot、mybatis 等&#xff1b;2、【修复】“CVE-2022-43402” groovy 低版本漏洞修复。3、【修复】“CVE-2024-29025” netty 低版本漏洞修复。4、【修复】“CVE-2024-…

【C++进阶】--特殊类设计

1. 设计一个类&#xff0c;不能被拷贝 C98 将拷贝构造函数与赋值重载只声明不定义&#xff0c;并且将其访问权限设置为私有即可 class CopyBan { // ... private:CopyBan(const CopyBan&);CopyBan& operator(const CopyBan&); //... };C11 class CopyBan { // .…

c语言中声明的问题【求个关注!】

文章目录 1 变量的声明与定义&#xff08;1&#xff09;定义与声明的区别&#xff1a;&#xff08;2&#xff09;为什么要区分定义与声明&#xff1f;&#xff08;3&#xff09;extern是什么 ?&#xff08;4&#xff09;举例&#xff1a; 2 函数的声明&#xff1a;函数声明的格…