gcc原理和使用

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 DEBUGprintf("我是一个dccc\n");
#endiffor (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.mzph.cn/news/823333.shtml

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

相关文章

宝塔使用笔记

1.配置ssl 验证方式&#xff1a;文件验证和dns验证都试一下 参考&#xff1a; https://app.applebyme.cn/cloud/https/23050.html

自定义类型: 联合体和枚举

本文索引 1. 联合体1.1 联合体类型的声明1.2 联合体的特点1.3 相同成员的结构体和联合体对比1.4 联合体大小的计算 2. 枚举类型2.1 枚举类型的声明2.2 枚举类型的优点2.3 枚举类型的使用 前言 : 书接上文, 下面我将继续详解C语言的剩下两个自定义类型: 联合体和枚举 个人主页…

当面试问你接口测试时,不要再说不会了!

很多人会谈论接口测试。到底什么是接口测试&#xff1f;如何进行接口测试&#xff1f;这篇文章会帮到你。 01 前端和后端 在谈论接口测试之前&#xff0c;让我们先明确前端和后端这两个概念。 前端是我们在网页或移动应用程序中看到的页面&#xff0c;它由 HTML 和 CSS 编写…

第十五届蓝桥杯复盘python大学A组——试题B 召唤数学精灵

按照正常思路解决&#xff0c;由于累乘消耗大量时间&#xff0c;因此这不是一个明智的解决方案。 这段代码执行速度非常慢的原因在于它试图计算非常大的数的阶乘&#xff08;累乘&#xff09;&#xff0c;并且对于每一个i的值都执行这个计算。阶乘的增长是极其迅速的&#xff…

SQL数据库管理开发工具:DataGrip 2024(win/mac)激活版

JetBrains DataGrip是一款专业的SQL数据库管理开发工具。DataGrip允许您以不同的方式发展模式以及执行信息查询&#xff0c;并提供服务本地文化历史问题记录&#xff0c;可以提高跟踪您的所有学生活动并保护如果您不选择丢失您的工作。DataGrip允许您通过建立相应的操作按名称就…

HackMyVM-Connection

目录 信息收集 arp nmap WEB web信息收集 dirsearch smbclient put shell 提权 系统信息收集 suid gdb提权 信息收集 arp ┌─[rootparrot]─[~/HackMyVM] └──╼ #arp-scan -l Interface: enp0s3, type: EN10MB, MAC: 08:00:27:16:3d:f8, IPv4: 192.168.9.115 S…

[Linux]--关于进程控制

进程创建,fork/vfork 在linux中fork函数是非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;自进程中返回0&#xff0c;父进程返回子进程id&#x…

前端开发攻略---在页面上渲染大量元素,使用defer减少白屏等待时间,优化页面响应速度

1、优化前 2、优化后 3、优化思路 1、在元素数量不变的情况下&#xff0c;进行一步一步的渲染&#xff0c;先渲染一些重要的元素或者需要用户第一时间看到的元素。 2、使用Hooks封装优化函数 4、优化代码 拥有大量元素的组件&#xff08;Item&#xff09;&#xff1a;文件位置&…

Xshell无法输入命令输入命令卡顿

Xshell是一款功能强大的终端模拟软件&#xff0c;可以让用户通过SSH、Telnet、Rlogin、SFTP等协议远程连接到Linux、Unix、Windows等服务器。然而&#xff0c;在使用Xshell的过程中&#xff0c;我们可能会遇到一些问题。比如输入不了命令&#xff0c;或者输入命令很卡。这些问题…

C++ stl容器list的底层模拟实现

目录 前言&#xff1a; 1.创建节点 2.普通迭代器的封装 3.反向迭代器的封装 为什么要对正向迭代器进行封装&#xff1f; 4.const迭代器 5.构造函数 6.拷贝构造 7.赋值重载 8.insert 9.erase 10.析构 11.头插头删&#xff0c;尾插尾删 12.完整代码简单测试 总结&…

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

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

创新力作 | 模块化快建办公训练中心盛大开业

在上海国际旅游度假区的湖畔&#xff0c;由优积科技建造的城市赛艇中心如同一幅动人的画卷&#xff0c;展现在世人面前。这座赛艇中心不仅是赛艇运动的圣地&#xff0c;更是一个融合了技术创新与建筑美学的多功能交流平台&#xff0c;体现了上海这座城市的精神底色和对赛艇文化…

基于springboot实现人口老龄化社区服务与管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现人口老龄化社区服务与管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了人口老龄化社区服务与管理平台的开发全过程。通过分析人口老龄化社区服务与管理平台方面的不足&#xff…

网络编程(现在不重要)

目录 网络编程三要素与InetAddress类的使用 软件架构 面临的主要问题 网络编程三要素&#xff08;对应三个问题&#xff09; InetAddress的使用 TCP与UDP协议剖析与TCP编程案例&#xff08;了解&#xff09; TCP协议 UDP协议 例子 UDP、URL网络编程 URL&#xff1a;&…

一夜爆红的4款国产软件,却一度被大众误以为是外国人开发

在现今高度信息化的时代&#xff0c;计算机已经深深地渗透到了我们生活的每一个角落。 从日常的办公学习到娱乐休闲&#xff0c;几乎都离不开计算机技术的支持。而在这背后&#xff0c;软件作为计算机的灵魂&#xff0c;其发展历史可谓波澜壮阔。 中国软件产业经过多年的积累和…

node express 请求参数接收方式汇总

express 安装使用 express官网 express 是node.js 中写后端服务比较流行的框架。 安装express npm install -g express安装 express-generator 相当于vue的cli 用来快速生成express项目 npx express-generator生成项目mynode -e是使用ejs模版 express -e mynodeexpress生成器生…

2024电容笔专业对比评测:西圣、倍思、绿联哪款平替电容笔更好用?

在当今学习和工作环境中&#xff0c;iPad作为一种多功能的学习和生产力工具&#xff0c;受到越来越多人的青睐与需求。然而&#xff0c;要充分发挥iPad的功能&#xff0c;一个优质的电容笔是必不可少的配件之一。电容笔不仅可以帮助用户进行手写笔记、绘画创作&#xff0c;还能…

新手做抖音小店,想要快速起店,抓住这两点很关键

大家好&#xff0c;我是电商笨笨熊 抖音小店一定是近几年来爆火的电商项目&#xff0c;凭借着直播电商的方式在短短几年内迅速崛起&#xff0c;成为现在人尽皆知的电商项目。 然而在抖店里&#xff0c;不少进入的玩家都是新手&#xff0c;甚至都是盲目入店&#xff0c;没有任…

【Unity】Feature has expired(H0041)

【背景】 在一台很久不用的电脑上更新了个人License&#xff0c;并导入了云项目&#xff0c;打开时却报错&#xff1a; 【分析】 网上查说要删缓存等等&#xff0c;试过都不行。重装Hub也不行。 这种环境类型的原因很难从信息入手定位错误。 所以我自己检查项目上有什么问题…

MATLAB 浮点数 转化为 定点数

a fi(v,s,w,f) 一个 fi 对象&#xff0c;其值为 v&#xff0c;符号性为 s&#xff0c;字长为 w&#xff0c;小数长度为 f。 AD9361 a fi(0.707,1,12,11)