Linux编译器 gcc/g++使用

news2024/9/25 19:22:06

目录

0.前言

1.C/C++编译链接过程回顾

2.gcc如何完成编译链接

2.1预处理

2.2编译

2.3汇编

2.4链接

3.gcc编译选项

4.函数库

4.1静态库

4.2动态库

5.小结


(图像由AI生成) 

0.前言

在Linux系统中,C/C++编程的开发工具不可或缺,其中gcc(GNU Compiler Collection)和g++是最常用的编译器。作为开发人员,熟悉这些工具的使用至关重要。在本节中,我们将介绍gcc/g++的使用,回顾C/C++的编译链接过程,并详细讲解gcc如何完成每一步操作。

1.C/C++编译链接过程回顾

在C/C++程序开发中,源代码需要经过几个重要步骤才能变成最终的可执行文件。了解这些步骤不仅有助于调试和优化代码,还能帮助开发人员更好地理解编译器的工作机制。下面详细介绍每个步骤:

预处理(Preprocessing)

预处理是编译过程的第一步。它的主要任务是处理所有以#开头的预处理指令,例如#include#define#ifdef等。在这一步中,预处理器会将所有包含的头文件展开,将宏替换为定义的内容,并处理条件编译指令。预处理的输出是一个扩展名为.i的中间文件,这个文件包含了展开后的代码。

编译(Compilation)

在编译阶段,编译器将预处理后的源代码转换为汇编代码。这个过程包括语法分析和语义分析,以确保代码符合C/C++语言的规则。然后,编译器会将源代码转换为等价的汇编指令。这一步的输出是一个扩展名为.s的汇编文件。

汇编(Assembly)

汇编阶段将汇编代码转换为机器码,这些机器码可以直接被计算机的处理器执行。汇编器会将汇编指令转换为二进制的目标代码,并生成扩展名为.o的目标文件。每个源文件都会生成一个对应的目标文件。

链接(Linking)

链接是编译过程的最后一步,它将多个目标文件和库文件合并为一个可执行文件。在这一阶段,链接器会解析所有的外部符号,将各个目标文件中的代码和数据段连接在一起,并处理函数调用和全局变量引用。链接器还会将必要的库文件(例如标准库)链接到目标文件中,生成最终的可执行文件。

2.gcc如何完成编译链接

2.1预处理

预处理是编译过程的第一步。在这一步,gcc将处理所有的预处理指令,例如#include#define#if等,去除注释,并展开所有的宏。预处理后的输出是一个纯C/C++代码的文件,通常扩展名为.i

示例命令:

gcc -E hello.c -o hello.i

选项-E表示仅进行预处理,不进行后续的编译、汇编和链接过程。选项-o指定输出文件名。

2.2编译

在编译阶段,gcc将预处理后的代码转换为汇编代码。这个过程中包括了语法和语义检查,以确保代码没有语法错误,并生成相应的汇编代码文件,扩展名为.s

示例命令:

gcc -S hello.i -o hello.s

选项-S表示仅进行编译,不进行后续的汇编和链接过程。

2.3汇编

汇编阶段是将汇编代码转换为机器码,这个过程会生成一个二进制目标文件,扩展名为.o。目标文件包含了机器可以识别的指令,但还不是一个完整的可执行文件。

示例命令:

gcc -c hello.s -o hello.o

选项-c表示仅进行汇编,不进行后续的链接过程。

2.4链接

链接阶段是编译过程的最后一步。gcc会将多个目标文件和所需的库文件链接在一起,生成最终的可执行文件。在这个过程中,链接器会解析所有的外部符号,并将它们正确地连接起来。

示例命令:

gcc hello.o -o hello

最终生成的文件hello就是可以在系统上运行的可执行文件。

通过上述四个步骤,gcc将源代码逐步转换成最终的可执行文件。在实际开发中,gcc通常会一次性完成所有步骤,但了解每个步骤的具体作用有助于更好地调试和优化代码。

3.gcc编译选项

在使用gcc进行编译时,有许多选项可以帮助我们控制编译过程和优化生成的代码。下面列出了一些常用的gcc编译选项,并对其功能进行了简要说明:

  • -E:只进行预处理,不进行编译、汇编和链接。需要将预处理结果重定向到一个输出文件。

    • 示例:gcc -E source.c -o source.i
  • -S:将源代码编译为汇编代码,不进行汇编和链接。

    • 示例:gcc -S source.c -o source.s
  • -c:将源代码编译为目标文件,不进行链接。

    • 示例:gcc -c source.c -o source.o
  • -o:指定输出文件名。可以用于指定生成的目标文件或可执行文件的名称。

    • 示例:gcc source.c -o executable
  • -static:生成静态链接的可执行文件。静态链接的文件包含了所需的所有库,因此生成的文件较大。

    • 示例:gcc -static source.c -o executable
  • -g:生成包含调试信息的目标文件。这些调试信息可以被GNU调试器(GDB)使用,以便在调试时查看源代码。

    • 示例:gcc -g source.c -o executable
  • -shared:生成共享库(动态库)。共享库在运行时被动态加载,文件较小,但需要系统中有相应的动态库支持。

    • 示例:gcc -shared -o libshared.so source1.o source2.o
  • -O0-O1-O2-O3:编译器的优化选项。-O0表示不进行优化,-O1表示基本优化,-O2表示较高级别的优化,-O3表示最高级别的优化。

    • 示例:gcc -O2 source.c -o executable
  • -w:禁止所有警告信息的生成。

    • 示例:gcc -w source.c -o executable
  • -Wall:启用所有常用的警告信息。这有助于开发人员发现潜在的问题。

    • 示例:gcc -Wall source.c -o executable

以上这些选项可以单独使用,也可以组合使用,以满足不同的编译需求。例如,要生成包含调试信息且经过优化的可执行文件,可以使用以下命令:

gcc -g -O2 source.c -o executable

掌握这些编译选项,可以更好地控制编译过程,生成高效、可调试的程序。

4.函数库

在C/C++程序开发中,函数库扮演着至关重要的角色。函数库可以使程序员复用已有的代码,提高开发效率,减少错误。函数库一般分为静态库和动态库两种。

4.1静态库

静态库是指在编译时链接的库。静态库的代码会被直接加入到可执行文件中,因此生成的可执行文件会比较大。静态库在运行时不需要额外的库文件支持,其扩展名一般为.a

  • 优点:使用静态库生成的可执行文件是自包含的,在运行时不需要依赖外部库文件。这使得程序在不同系统上运行时更加稳定,因为不需要考虑库文件版本的问题。
  • 缺点:由于所有的库代码都被包含在可执行文件中,生成的文件会比较大,占用更多的磁盘空间。此外,如果多个程序使用相同的静态库代码,每个程序都会包含一份相同的代码,导致冗余。

4.2动态库

动态库在程序运行时被加载,扩展名一般为.so。动态库在运行时动态加载到内存中,多个程序可以共享相同的动态库文件,从而节省内存空间。

  • 优点:动态库可以在运行时加载,这意味着程序启动时所需的内存较小。多个程序可以共享同一个动态库文件,减少了内存占用和磁盘空间。同时,更新动态库不需要重新编译和链接所有依赖它的程序,只需要替换动态库文件即可。
  • 缺点:依赖动态库的程序在运行时需要确保系统中存在相应的动态库文件。如果动态库文件缺失或版本不匹配,程序可能无法正常运行。

在使用gcc编译程序时,默认会使用动态库进行链接。如果需要使用静态库,可以在编译时指定相应的选项。理解和选择适当的库类型,有助于优化程序的性能和部署方式。

5.小结

通过本文的介绍,我们详细探讨了C/C++编译链接的过程,包括预处理、编译、汇编和链接,解释了gcc编译器在每个阶段的具体作用,并列举了常用的编译选项和函数库的区别及其使用方法。掌握这些知识,不仅可以帮助开发人员更高效地编写和调试代码,还能优化程序的性能和兼容性,为C/C++开发打下坚实的基础。

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

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

相关文章

写给非机器学习人员的 embedding 入门

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

合并两个有序数组(LeetCode)

题目 给你两个按 非递减顺序 排列的整数数组 和 ,另有两个整数 和 ,分别表示 和 中的元素数目。请你 合并 到 中,使合并后的数组同样按 非递减顺序 排列。 注意:最终,合并后数组不应由函数返回,而是…

Word中加载Mathtype后粘贴复制快捷键(Ctrl+C/V)不能使用

操作环境 windows 11操作系统 word版本2021 mathtype版本7.4 这个问题只出现在word中,在excel和ppt中都不存在这个问题,而且之前在另一台电脑中使用word2016版本并没有这种问题的,然后网上搜了一下有不少人有这种问题,word直接取…

nodejs/node-sass/sass-loader三者版本对应关系(已解决)

基本前提:了解版本对应关系 示例: 我的nodejs:v14.21.3, 则package.json: "node-sass": "^4.14.1", "sass-loader": "^8.0.0",扩展: 查看node历史版本: Node.js…

【数据结构-前缀哈希】力扣525. 连续数组

给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。 示例 1: 输入: nums [0,1] 输出: 2 说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。 示例 2: 输入: nums [0,1,0] 输出: 2 说明: [0, 1] (或 [1, 0]) 是…

摸着石头过河的具身智能公司,正在寻求“确定性”

在种种不确定因素之下,对于具身智能,唯一可以确定的是,其未来巨大的市场空间。从纷纷入局的科技巨头、创业公司的市场现状即可窥见一二。而类比到自动驾驶,其也是抛开层层迷雾后才得以在今天看见曙光。 相信,于具身智…

高效报销管理:领先软件的综合评测

本文主要介绍了以下10款报销管理软件:合思、明道云、汇联易、畅捷通、慧算账、云之家、Ramp、Nexonia by Emburse、Rydoo、Expensify。 在处理财务报销时,你是否经常感到手续繁琐、效率低下?选择合适的软件系统,能够显著优化整个报…

亚信安全以安全守护的“星座”正闪耀太空

近日来,一个Made in China的“星座”闪耀太空,受到世界瞩目。“千帆星座”计划,首批18颗商业组网卫星成功发射升空,目前已顺利进入停泊轨道,见证了我国卫星互联网发展的重要时刻,未来将开启面相全球用户的低…

模块化叙事的演变:DeFi借贷开发的模块化转型

随着区块链技术的不断发展,去中心化金融(DeFi)正经历一场深刻的变革。模块化借贷作为这一变革的重要部分,正逐渐成为加密金融领域的焦点。本文将探讨模块化借贷的起源、演变及其未来发展方向。 一、模块化的起源 模块化区块链的概…

5.2二叉树的概念

5.2.1二叉树的定义 二叉树特点: ①每个节点最多只有两颗子树 ②二叉树的子树有左右之分,不能随意颠倒 ③二叉树为有序树 几种特殊的二叉树 满二叉树 除叶节点之外的每个节点度数均为2 对于编号i的节点,若有双亲,则双亲为i/2-向下取整 若有左孩子,则为2i;若有右孩子则为…

云计算实训24——python基本环境搭建、变量和数据类型、数据集合、py脚本

一、python环境搭建 确保拥有阿里云镜像 查看python环境 [rootpython ~]# yum list installed | grep python 查看epel是否安装 [rootpython ~]# yum list installed | grep epel 安装epel [rootpython ~]# yum -y install epel-release.noarch 查看是否安装python3 [rootpyt…

AI 点燃体育热情!使用 PAI-Artlab 定制专属海报

PAI ArtLab 是人工智能平台 PAI 为设计专业人士打造的 AIGC 智能设计工具,支持云端Stable Diffusion、Kohya 等主流文生图与模型训练应用,提供 AIGC 全场景能力。为了向在赛场上的奥运健儿传递最真挚的鼓舞与喝彩,我们特此发起一场别开生面的…

远程终端 XShell 下载安装配置使用(超详细)

今天给伙伴们分享一下VMware Workstation17 安装 Windows 10 操作系统,希望看了有所收获。 我是公众号「想吃西红柿」「云原生运维实战派」作者,对云原生运维感兴趣,也保持时刻学习,后续会分享工作中用到的运维技术,在…

【数学建模】简单的优化模型-5 不买贵的只买对的

背景 在琳琅满目的市场里选购商品,我们往往遵循 “不买贵的,只买对的” 的准则。然而哪些商品、买多少才是“对的”?这时候,我们需要用到,消费者追求最大效用(经济学的最优化原理),…

java学习笔记 VSCode

2.管理员身份打开cmd,切换存文件的路径 2.输入下面命令创建文件 npm create vitelatest 将项目命名为easyb选择vue--->JavaScript 3,用管理员身份打开VSCode,打开刚刚创建的easyb 4.下载包 npm install npm install vue-router npm install axios npm install element-plus…

数据可视化入门:使用 Matplotlib、Numpy 和 SciPy 绘图

数据可视化是数据分析不可或缺的工具,它通过图形化手段帮助我们更直观地理解数据。Python拥有多种库来实现数据可视化,其中matplotlib、numpy和scipy是最常用的几个。本文将详细介绍如何使用这些库来创建各种图表和曲面。 环境搭建 在开始之前&#xf…

SPSS、Python员工满意度问卷调查激励保健理论研究:决策树、随机森林和AdaBoost|附代码数据

全文链接:https://tecdat.cn/?p37293 原文出处:拓端数据部落公众号 在深入了解公司当前的实际情况和员工内心真实想法的基础上,我们旨在从专业视角出发,为企业在组织管理方面的不足进行诊断,并进行全面审视。 为了…

激发创意:十大设计灵感网站推荐

在设计的世界里,灵感是推动创意发想和项目实现的关键因素。设计师们常常需要寻找新的灵感来源,以保持作品的新鲜感和创新性。幸运的是,互联网上有许多优秀的设计灵感网站,它们提供了丰富的资源和启发,帮助设计师们打破…

leetcode-二叉树oj题1(共三道 965,100,144)--c语言

目录 a. 二叉树的概念以及实现参照博客: 一、三道题的oj链接 二、每题讲解 1.单值二叉树 a. 题目: b. 题目所给代码 c. 思路 d. 代码: 2. 相同的树 a. 题目 b. 题目所给代码 c. 思路 d. 代码 3. 二叉树的前序遍历 a. 题目 b.…

软考:软件设计师 — 11.UML 建模

十一. UML 建模 UML 建模部分是下午场考试中第三个题目,分值 15 分。先介绍一下这类题目的考查形式。 1. 考察形式 (1)类图与对象图 填类名,方法名,属性名填关系填多重度 UML 中四种基本关系: 依赖关…