gcc与g++的安装和使用

2023-11-08

首先大致介绍一下gcc和g++.

在此之前,你需要先安装gcc与g++,然后才能进行指令操作.

命令如下:

sudo yum install -y gcc-c++

在命令行输入以上指令后,gcc/g++便成功安装了. 

gcc是一个专门用来编译链接c语言的编译器.   g++(c++).

gcc只能编译c语言,不能编译c++语言.而g++既可以编译C++语言,也可以编译C语言.

在此之前,我们需要了解一些基础的背景知识.

目录

1.gcc/g++的使用

2.gcc如何生成可执行文件的?

1.预处理

2.编译

3.汇编

4.链接

3.动静态库


1.gcc/g++的使用

先教一下怎么直接使用gcc和g++编译成可执行文件.

命令格式:

gcc -o [可执行文件] [要被编译的文件]

gcc [要被编译的文件] -o [可执行文件].

g++也是一样的格式.

这里你只要记住 -o后面加可执行文件就行了,无论顺序怎样,剩下的就是要被编译的文件.

例:

我们要把test.c编译成test可执行文件,输入以下命令:

gcc -o test test.c

gcc test.c -o test

即可生成一个名为test的可执行文件.

以上是使用的方法,此时如果不想深入研究便可以结束了.掌握以上指令即可;如果继续想深入了解是怎么程序是怎样编译成可执行程序的,可以继续向下看.

---------------------------------------------------------------------------------------------------------------------------------

2.gcc如何生成可执行文件的?

一个C/C++程序变成一个可执行文件,需要经过以下4个过程.

1.预处理

在这个阶段,编译器会对程序做出以下行为:

1.去注释 2.宏替换 3.头文件展开 4.条件编译 等

这里需要介绍一下什么是条件编译.

我们创建一个.c文件,写入以下代码:

#include<stdio.h>
  2 
  3 int main()
  4 {
  5   printf("Hello, world\n");
  6 
  7 
  8 //条件编译,如果为Debug模式,就输出“Hello, Debu”,否则输出“Hello,Release”
  9 #ifdef DEBUG 
 10   printf("Hello, Debug\n");
 11 #else
 12   printf("Hello,Release\n");
 13 #endif                                                                                                                                                                                                       
 14 }

 编写好之后,我们使用gcc编译这个文件

gcc file.c

默认会生成一个a.out可执行文件,我们运行(./文件名)它,观察输出结果.

可以看到此时输出Release,可知此时编译并不是以Debug模式编译的.

 条件编译大概就是这样,主要是区分系统型号以及编译模式等.方便多平台可以运行.

那么我们如何知道预处理之后的结果呢?

使用以下指令:

gcc –E file.c –o file.i

这段指令的作用是:将file.c 预处理完成后的结果 放到 file.i文件中.

所以选项-E的作用是:

-E:从现在开始进行程序的翻译,如果预处理完成,就停下来!

 可以看到生成了一个file.i的文件,这个便是file.c预处理之后的文件。

我们看看两者的区别,首先打开file.c文件,然后在命令行输入:vs file.i,比较两者的区别

首先可以看到头文件被展开了,stdio头文件中被展开了之后,有这么些头文件.

 

 可以看到宏M被直接替换,然后条件编译选择了Release.注释也被去掉了.

注释去掉之后依然是c语言.

2.编译

这个阶段的作用是:将C语言编译成汇编语言.

指令如下:

gcc -S file.i -o file.s

它将我们刚才预处理好的C语言文件编译成汇编语言.

-S:从现在开始进行程序的翻译,如果编译完成,就停下来.

 可以看到多出来一个file.s文件,我们打开观察一下:

 可以看到原本的C语言文件已经转化成了汇编语言,如寄存器,助记符等.

3.汇编

这一步会将汇编语言转化成 可重定向二进制目标文件。

为什么是可重定位,后面链接会说.

指令:

gcc -c file.s -o file.o

 -c作用:从现在开始进行程序的翻译,如果汇编完成,就停下来.

 

 可以看到多出来一个.o文件,我们此时打开它:

可以看到已经转化成了二进制文件.

4.链接

此时你只需要告诉gcc你需要形成什么可执行文件即可.

为了方便演示,我把之前形成的可执行文件删除掉,如下:

 此时我们正式链接,比如我们想形成一个名字为file的可执行文件:

gcc file.o -o file

 

此时可以发现多出了file可执行文件,我们./执行它

可以看到已经成功执行了. 

但是具体是怎么样链接的呢,链接的过程是怎样的呢?这里涉及到动静态库.

3.动静态库

一般链接方式有两种:

静态链接 --- 利用静态库

动态链接 --- 利用动态库

先来看以下内容:

通过后缀.so可以知道是动态库 

通过dynamically linked可以大致知道是动态链接.

这是只是大体让大家看一下形式.

那么话说回来,我们平常自己写过printf函数吗?

那么肯定大部分人说写过,刚才文件里还写了一个输出hello world呢

其实呢,printf这个函数本身我们并没有实现,只是在用这个函数,那么这个函数在哪呢?

我们要想编译一个程序,一定会包含大量的头文件。这些函数的声明和实现也在这些头文件中.

那我们先来看一下头文件.

ls /usr/include

可以看到存在大量的头文件.

那假设我们需要找一下printf函数的声明,它在stdio.h文件中,我们来看一下

vim /usr/include/stdio.h 

 

 从这里可以看到它的声明.

可是只有声明,那实现在哪呢?只有声明没有实现那代码可正常执行不了啊.

实际上,在C语言中,这些实现的源代码并不会直接给你呈现,而是以动静态库的形式存储的.

我们输入:

ls /lib64

可以发现里面存储了所有的动静态库.

所以一般链接的时候呢,是从头文件中找函数的声明,从库中找文件的实现.

把我的代码和库中的代码以某种方式关联起来,形成可执行程序(.exe).

以下是在不同环境下,动静态库所对应的后缀.

在Linux下: .so(动态库), .a(静态库)

在Windows下: .dll(动态库 ), .lib(静态库)

以上是对动静态库的简单的理解.

那么什么是动静态链接呢?

先来说动态链接

在我们写好我们C语言程序之后,有一些库函数比如printf,scanf,strlen等等,这些在被编译之时,编译器会将其替换成库中的这个函数的地址。

这样在执行到这个函数的时候,编译器便可以根据这个地址找到这个库乃至找到这个函数.

这边是动态链接.

那么什么是静态链接呢?

这个与动态链接不同的是:这些程序在编译时,编译器会直接将库中方法的实现,整体拷贝一份到我们的可执行程序中!而不是那个函数的地址了.

但是缺点也很明显:会占用资源,想想好几份相同的代码拷贝到这里,再次运行一定占用大量的资源.当然优点是不会再依赖库。动态链接和它相反.

gcc 和 g++ 是默认动态链接的.

同时也要注意,使用动态链接也必须要有.so动态库文件。 使用静态链接也必须使用.a静态库文件.

Linux下默认是提供动态库文件的,静态库文件需要自己手动下载,如果感情去想去尝试一下,可以使用一下指令安装静态库:

C静态库:

sudo yum install -y glibc-static

C++静态库

sudo yum install -y libstdc++-static

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gcc与g++的安装和使用 的相关文章

  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • python下的pyecharts应用4----绘制cpu折线图

    要求 1 截止到运行一刻 2 每秒钟监测 3 绘制折线图 设计 获取cpu的代码如下 1 获取系统cpu占有率的信息 import psutil import time 隔1s绘制cpu的占有率 gt 持久化的保存 如何将时间和对应的cpu
  • html5 页面可以上下滚动条,h5页面上下左右滑动

    var startX 0 startY 0 operate 0 backDom addEventListener touchstart function evt evt preventDefault var touch evt touche
  • js身份证号校验

    if card console log 请输入身份证号 身份证号不能为空 return false if isCardNo card false console log 您输入的身份证号码不正确 return false 检查省份 if c
  • 西门子PLC的常见的通讯方式

    1 PPI通信 T PPI协议是S7 200cpu最基本的通信方式 S7 200cpu的默认通信方式可通过原端口通信 西门子PLC是一种专为工业环境应用而设计的数字操作电子系统 可编程存储器 存储逻辑操作 顺序控制 定时 计数 算术操作等指
  • Ubuntu常用命令汇集

    ubuntu常用命令汇集 文章目录 一 文件组织结构 二 常用命令 三 权限 一 文件组织结构 为根目录 为系统最基本的目录 home下有用户名的文件夹 该文件夹就是 为主目录 为日常使用的目录 命令在终端中输入 需要注意当前所在的文件夹
  • 神经网络学习小记录64——Pytorch 图像处理中注意力机制的解析与代码详解

    神经网络学习小记录64 Pytorch 图像处理中注意力机制的解析与代码详解 学习前言 什么是注意力机制 代码下载 注意力机制的实现方式 1 SENet的实现 2 CBAM的实现 3 ECA的实现 注意力机制的应用 学习前言 注意力机制是一
  • 第2课:Scratch介绍

    什么是Scratch Scratch 一款免费的图形化少儿编程工具 由麻省理工学院设计开发 它是完全免费的 它将一大片代码变成一个个功能模块 界面非常清晰 小朋友可以像搭积木一样做出自己的游戏程序 对于低年级的小朋友很容易上手 而且很容易培
  • 使用k8s业务在十几分钟无人使用时,访问报错问题

    业务放入k8s测试中发现当十几分钟没有访问 再次访问时就会报错 刷新后业务正常 一直访问故障不复现 通过整体测试发现Redis自动断开连接 redis在使用net网络模式时会出现自动断开问题 升级Redis版本后解决
  • 傅里叶变换,高通,低通滤波

    傅里叶变换 傅里叶变换的作用 高频 变化剧烈的灰度分量 例如边界 低频 变化缓慢的灰度变量 例如一片大海 滤波 低通滤波器只保留低频 会使头像模糊 高通滤波器只保留高频 会使图像细节增强 opencv主要就是cv2 dft 和cv2 idf
  • 机械臂机器人——使用Matlab Robotic ToolBox建立四轴机械臂模型并实现运动控制仿真

    文章目录 四轴机械臂实物 Robotic ToolBox机械臂建模 1 建立机械臂的D H表 建立机械臂坐标系 根据坐标系建立D H表 2 代码建模 机械臂运动学仿真 1 正运动学仿真 2 逆运动学仿真 为了能够实现机械臂的运动轨迹规划 同
  • Github Page 个人主页——自定义域名

    1 前言 看本文前请确认已部署好基础的静态网页 参考上篇文章 Github Page 个人主页 项目部署 部署好的个人网页若使用 username github io 访问 会让别人很难记住 这时就可以使用自定义域名来绑定仓库了 本文将介绍
  • Centos 安装 Kafka 后台启动 教程

    安装 官网 http kafka apache org downloads 1 下载 Python wget http mirrors tuna tsinghua edu cn apache kafka 0 11 0 0 kafka 2 1
  • html自动图片尺寸,关于html:CSS背景图像适合宽度,高度应按比例自动缩放

    我有 body background url images background svg 期望的效果是该背景图像的宽度等于页面的宽度 高度变化以保持比例 例如 如果原始图像恰好是100 200 任何单位 且正文宽度为600px 则背景图像最
  • 2021-11-02 B1026 简单的时间转换显示和将小数四舍五入

    B1026 简单的时间转换显示和将小数四舍五入 原题 1026 程序运行时间 15 分 要获得一个 C 语言程序的运行时间 常用的方法是调用头文件 time h 其中提供了 clock 函数 可以捕捉从程序开始运行到 clock 被调用时所
  • java没有报错,但编译失败。

    这段代码总是编译失败 但是idea没有报错 这东西是抽象类 解决办法 jdk版本问题 虽然都是1 8 换成了333就没问题了 个人经验 换成版本高的试试
  • C++: 'identifier': identifier not found [Compiler Error C3861]

    问题 模板类继承模板类时 子类无法直接访问父类成员 会报如下错误 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C3861 insertAsLast 找不到标识符 DSA D Code DSA DSA Queue h 8 环境 V
  • 解决Vscode中unresolved import “XXX” 问题

    正常导入同级目录的 py文件 报黄色警告 原因 在Vscode中 import后面跟着的 必须是全路径 将import后面的文件路径 修改成全路径 便不会有unresolved import XXX 警告
  • adele心理学

    人生中最大的谎言就是不活在此时此刻 纠结过去 关注未来把微弱而模糊的光打向人生整体 自认为看到了些什么 你之前就一直忽略 此时此刻 只关注根本不存在的过去和未来 对自己的人生和无可替代的刹那撒了一个大大的谎言 我们应该更加认真地过好 此时此
  • 华为OD机试 C++ 异常的打卡记录

    描述 我们的目标是查找出那些异常的员工打卡记录 异常的定义是 打卡所用的设备号与员工注册的设备号不匹配 同一个员工两次打卡的时间间隔小于60分钟 但距离超过5km 你会得到一个字符串数组 里面包含每条打卡记录 格式为 工号 时间 分钟 距离
  • gcc与g++的安装和使用

    首先大致介绍一下gcc和g 在此之前 你需要先安装gcc与g 然后才能进行指令操作 命令如下 sudo yum install y gcc c 在命令行输入以上指令后 gcc g 便成功安装了 gcc是一个专门用来编译链接c语言的编译器 g