前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >深入理解GCC 和 G++ 编译器

深入理解GCC 和 G++ 编译器

作者头像
DevKevin
发布于 2024-12-31 00:52:07
发布于 2024-12-31 00:52:07
29901
代码可运行
举报
文章被收录于专栏:Base_CDNKevinBase_CDNKevin
运行总次数:1
代码可运行
GCC 和 G++ 是 GNU 工具链中的核心工具,为 C 和 C++ 程序开发提供强大支持。它们实现了从源代码到可执行文件的完整编译过程,本文将详细介绍它们的编译流程、常用选项及其应用,并深入解析动态链接与静态链接的特点和区别。

一、GCC/G++ 编译器的背景知识

GCC(GNU Compiler Collection)和 G++ 是 GNU 项目的一部分。GCC 是一个多语言支持的编译器,可以处理 C、C++、Fortran 等语言,而 G++ 是 GCC 的 C++ 前端,用于专门处理 C++ 源代码。

GCC/G++ 的编译过程分为四个主要阶段:

1. 预处理阶段

预处理是编译的第一个阶段,主要完成以下任务:

  • 宏替换:替换所有 #define 定义的宏。
  • 条件编译:根据预处理指令(如 #ifdef)选择性地编译代码。
  • 去除注释:删除源代码中的注释内容。
  • 展开头文件:将 #include 指定的文件插入到源代码中。

命令示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gcc -E hello.c -o hello.i
  • **选项 **-E:执行预处理并停止。
  • **输出文件 **.i:预处理后的代码。
2. 编译阶段

在此阶段,编译器会:

  • 检查源代码的语法和语义是否正确。
  • 将 C/C++ 源代码翻译为汇编语言代码。

命令示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gcc -S hello.i -o hello.s
  • **选项 **-S:仅执行编译,生成汇编代码。
  • **输出文件 **.s:包含汇编代码。
3. 汇编阶段

汇编阶段将汇编代码转换为机器可识别的目标代码(二进制格式)。

命令示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gcc -c hello.s -o hello.o
  • **选项 **-c:仅执行汇编,生成目标文件。
  • **输出文件 **.o:二进制目标文件。
4. 连接阶段

连接阶段将多个目标文件和库文件链接在一起,生成可执行文件或库文件。连接过程中可能会调用外部的动态或静态库。

命令示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gcc hello.o -o hello
  • **输出文件 **hello:最终生成的可执行文件。

二、GCC/G++ 常用编译选项

GCC 和 G++ 提供了多种选项,支持不同的编译需求。以下是一些常见选项及其功能:

基础选项

选项

功能描述

-E

只执行预处理,生成 .i 文件

-S

只执行编译,生成 .s 汇编文件

-c

只执行汇编,生成 .o 二进制目标文件

-o

指定输出文件名

-g

生成调试信息,供调试器(如 GDB)使用

-Wall

打开所有常见的警告信息

-O0

不进行优化

-O1

启用基本优化

-O2

启用进一步优化

-O3

启用最高级别优化,可能导致代码体积增大

-static

使用静态链接,生成不依赖动态库的可执行文件

-shared

生成动态库

三、动态链接与静态链接

程序开发中,链接是将目标文件与库文件结合的过程,链接方式主要分为静态链接和动态链接。

1. 静态链接

静态链接是在编译阶段将库文件的代码直接嵌入到可执行文件中。

优点:
  • 独立性:生成的可执行文件不依赖外部库,运行时无需额外的动态库支持。
  • 高效性:运行速度快,因为无需动态加载库。
缺点:
  • 文件体积大:库代码被嵌入到每个可执行文件中,增加了文件体积。
  • 更新困难:若库文件更新,需要重新编译所有依赖该库的程序。

命令示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gcc hello.o -o hello -static
2. 动态链接

动态链接是在程序运行时加载所需的库文件,而非将其嵌入到可执行文件中。

优点:
  • 节省空间:多个程序可以共享同一个动态库,减少存储需求。
  • 易于更新:库文件更新后,无需重新编译程序。
缺点:
  • 运行依赖:程序运行时必须保证动态库的存在。
  • 启动时间:动态加载库可能略微增加程序的启动时间。

查看动态链接依赖库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ldd hello

示例输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
linux-vdso.so.1 =>  (0x00007fffeb1ab000)
libc.so.6 => /lib64/libc.so.6 (0x00007ff776af5000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff776ec3000)

四、静态库与动态库

1. 静态库

静态库是在编译时被直接打包到可执行文件中的库文件,通常后缀为 .a

创建静态库:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ar rcs libhello.a hello.o
使用静态库:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gcc main.o -o main -L. -lhello
2. 动态库

动态库在程序运行时加载,通常后缀为 .so

创建动态库:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gcc -shared -o libhello.so hello.o
使用动态库:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gcc main.o -o main -L. -lhello

注意: 动态库默认存储路径为 /usr/lib/usr/local/lib,若库文件不在默认路径中,可以通过环境变量 LD_LIBRARY_PATH 指定动态库路径。


五、编译优化选项

GCC 和 G++ 提供了多种优化选项,开发者可以根据项目需求选择合适的优化级别:

优化级别

描述

-O0

无优化(默认)

-O1

基本优化

-O2

在不显著增加编译时间的前提下进行进一步优化

-O3

启用所有优化选项,可能导致代码体积增加

-Os

优化代码体积,适用于存储受限的设备

六、总结

GCC 和 G++ 是 C 和 C++ 开发中不可或缺的工具,它们提供了从预处理到最终链接的完整编译支持。理解编译的每个阶段及其常用选项,可以帮助开发者更高效地开发、调试和优化程序。同时,动态链接和静态链接各有优劣,开发者需要根据项目需求合理选择。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
手撸了一个全自动微信清粉小工具(源码详解)
文章链接:https://cloud.tencent.com/developer/article/2464880
南山竹
2024/12/01
2030
手撸了一个全自动微信清粉小工具(源码详解)
Appium常用操作之「Toast提示信息获取」
安卓 4.4 以上的版本都是基于 UiAutomator,现在已经改为 UiAutomator2 了。所以 Toast 在原来的 UiAutomator 基础上没办法识别,没法识别的话就需要利用 UiAutomator2了。
清菡
2020/11/20
2.5K3
Android自动化测试探索(四)uiautomator2简介和使用
项目Git地址: https://github.com/openatx/uiautomator2
周希
2019/10/15
6.2K0
移动端APP自动化测试框架-UiAutomator2基础
很早以前,我用uiautomator+java实践过Android APP自动化测试,不过今天要提的不是uiautomator,而是uiautomator2。听起来uiautomator2像是uiautomator的升级版,但是这两款框架仅仅是名字上比较相似,实际上没有任何关联。
大刚测试开发实战
2022/11/14
2.6K2
移动端APP自动化测试框架-UiAutomator2基础
Python 自动化,Appium 凭什么使用 UiAutomator2?
UiAutomator 是 Google 开发的一款运行在 Android 设备上的 UI 自动化测试工具,基于JAVA语言,使用它有一个限制,就是必须打包成 APK 或 JAR,然后上传到设备,才能运行
AirPython
2020/08/28
3.2K0
Python 自动化,Appium 凭什么使用 UiAutomator2?
APP自动化效果测试工具
项目测试过程中经常需要在手机端体验语音产品的识别效果和稳定性,识别效果与手机硬件强相关无法抛开硬件影响。因此开发了一套基于uiautomator2+python UI自动化工具,可以实现在电脑端控制手机demo开始收音+播放待测音频+保存识别结果的APP自动化效果测试工具。
芯动大师
2022/11/15
1.1K0
APP自动化效果测试工具
python + uiautomator2 实现钉钉工单提交
每个月初,团队负责人需要提交整个团队的上个月绩效评价以及本月的绩效设定,在钉钉上选择员工和Excel 附件提交员工个人审批。
叨叨软件测试
2021/04/07
1.2K0
python + uiautomator2 实现钉钉工单提交
不写一行代码实现mobile自动化
我们写移动自动化的时候,一般用appium, 感觉appium用起来太重了。 首先装环境得搞半天,然后启动一个driver要填很多参数,一个参数没填,或者填错了,就启动不起来。 如果是小白,遇到各种坑。好不容易跑起来了,写了一通代码,结果项目迭代了,又得重写。 有没有一种轻量的,可以录制的工具可以用呢? python-uiautomator2 自动化测试开源工具,其封装了谷歌自带的 uiautomator2 测试框架,可以运行在支持 Python 的任一系统上。
赵云龙龙
2021/04/02
1.1K0
不写一行代码实现mobile自动化
推荐⼀款超好⽤的UI⾃动化⼯具: UiAutomator2!
做过Android自动化测试的同学想必都知道,最开始用的UiAutomator是Google提供的⽤来做安卓⾃动化测试的⼀个Java库,基于Accessibility服务,功能强⼤,但仅⽀持Java语⾔,并原生框架一开始并不⽀持Python。
测试开发技术
2022/09/28
9060
APP 元素定位总结
推荐使用顺序:weditor > uiautomatorviewer > Appium inspector
叨叨软件测试
2021/04/08
1.1K0
快速搞定 uiautomator2 自动化测试工具使用
Google 官方提供了一个 Android 自动化测试工具(Java 库),基于 Accessibility 服务,功能很强,可以对第三方 App 进行测试,获取屏幕上任意一个 App 的任意一个控件属性,并对其进行任意操作,但有两个缺点:
霍格沃兹测试开发
2020/08/31
5.1K0
快速搞定 uiautomator2 自动化测试工具使用
我用几行 Python 自动化脚本完美解决掉了小姐姐的微信焦虑感
前几天,有一个小姐姐私聊我,说她每次打开微信,界面上密密麻麻的红点提示让她很惆怅,每一条消息她都要一条条去点击,太费时间且焦虑了
AirPython
2020/08/28
8780
我用几行 Python 自动化脚本完美解决掉了小姐姐的微信焦虑感
软件测试|uiautomator2 自动化测试工具使用
Google 官方提供了一个 Android 自动化测试工具(Java 库),基于 Accessibility 服务,功能很强,可以对第三方 App 进行测试,获取屏幕上任意一个 App 的任意一个控件属性,并对其进行任意操作,但有两个缺点:
霍格沃兹测试开发Muller老师
2023/01/09
8820
30 行代码实现蚂蚁森林自动“偷”能量
虽然我支付宝加了好多好友,平时有很多能量可以“偷”,但由于太懒,至今一棵树都没种成,所以心心念念把偷能量这事自动化。之前通过用代码模拟手机点按的方式,实现了朋友圈自动点赞(https://xindoo.blog.csdn.net/article/details/88374664),但当时蚂蚁森林的操作流程要比朋友圈点赞复杂很多,所以当时就没有实现自动偷能量。
生信交流平台
2022/09/21
9390
30 行代码实现蚂蚁森林自动“偷”能量
基于UiAutomator2+PageObject模式开展APP自动化测试实战
在上一篇《APP自动化测试框架-UiAutomator2基础》中,重点介绍了uiautomator2的项目组成、运行原理、环境搭建及元素定位等基础入门知识,本篇将介绍如何基于uiautomator2设计PageObject模式(以下简称PO模式)、开展移动APP的自动化测试实践。
大刚测试开发实战
2022/11/14
5400
基于UiAutomator2+PageObject模式开展APP自动化测试实战
ATX自动化测试学习
之前小编分享了《PyUnit+uiautomator2实现应用自动化回归测试实践》,MTSC听了《ATX在淘宝客户端实践》(ATX作者,ID:codeskyblue)的议题分享,进行学习总结。
用户5521279
2019/07/24
3.7K0
30 行代码实现蚂蚁森林自动收能量(附源码)
来源:blog.csdn.net/article/details/113734855
逆锋起笔
2021/05/18
1.8K0
30 行代码实现蚂蚁森林自动收能量(附源码)
Android Uiautomator2 脱机 Monkey 测试
前些日志在社区看了【有赞团队的一篇记一次基于Robotium 改造的测试实践】 https://testerhome.com/articles/18752.
测试加
2022/03/24
3.3K1
Android Uiautomator2 脱机 Monkey 测试
Android自动化之-python-uiautomator2入门简介
python-uiautomator2是一个自动化测试开源工具,仅支持Android平台的原生应用测试。python-uiautomator2封装了谷歌自带的uiautomator2测试框架,提供便利的python接口。他允许测试人员直接在PC上编写Python的测试代码,操作手机应用,完成自动化,大大提高了自动化代码编写的效率。
十四君
2019/11/23
3.2K0
技术分享 | app自动化测试(Android)-- 特殊控件 Toast 识别
Toast 是 Android 系统中的一种消息框类型,它属于一种轻量级的消息提示,常常以小弹框的形式出现,一般出现 1 到 2 秒会自动消失,可以出现在屏幕上中下任意位置。它不同于 Dialog,它没有焦点。Toast 的设计思想是尽可能的不引人注意,同时还向用户显示信息希望他们看到。
霍格沃兹测试开发学社
2022/06/24
4750
推荐阅读
相关推荐
手撸了一个全自动微信清粉小工具(源码详解)
更多 >
目录
  • 一、GCC/G++ 编译器的背景知识
    • 1. 预处理阶段
    • 2. 编译阶段
    • 3. 汇编阶段
    • 4. 连接阶段
  • 二、GCC/G++ 常用编译选项
    • 基础选项
    • 1. 静态链接
      • 优点:
      • 缺点:
    • 2. 动态链接
      • 优点:
      • 缺点:
  • 四、静态库与动态库
    • 1. 静态库
      • 创建静态库:
      • 使用静态库:
    • 2. 动态库
      • 创建动态库:
      • 使用动态库:
  • 五、编译优化选项
  • 六、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档