gcc与g++的安装和使用

news2025/1/11 4:26:12

首先大致介绍一下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

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

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

相关文章

cuda3 管理内存 代码解析额

内存管理 全局内存数据主要存放的地方 共享内存块内数据同步的地方 返回一个标记符 是否成功 比普通Malloc快一倍 统一内存分配释放 少了传输过程 同步拷贝 必须等拷贝完才会执行下面的 异步 注意拷贝是否完成&#xff0c;如果直接使用&#xff0c;并不知道拷贝是否完成 共…

微信小程序实现商品加入购物车案例

思考&#xff1a;购物车中的数据保存在哪里&#xff1f;用哪种数据结构进行保存&#xff1f; 小程序中可能有多个页面需要对购物车中的数据进行操作&#xff0c;因此我们想到把数据存到全局中。可以使用wx.setStorageSync()储存&#xff0c;用wx.getStorageSync()进行获取&…

Linux压缩与解压缩

目录 Linux压缩与解压缩 zip和unzip命令 定义 语法格式 参数及其作用 案例 素材准备 案例1 --- 使用zip也所文件test1.txt 案例2 --- 压缩率为最高压缩test2.txt 案例3 --- 将当前目录dir1连通目录下文件其压缩 实例4 --- 向压缩文件中test1.zip中添加test2.txt文件 实例5…

模型评估指标(一)Top-5和Top-1准确率

文章目录 一、前言二、什么是Top-5和Top-1准确率与错误率参考博客 一、前言 在看论文里面提到Top-5和top-1错误率&#xff0c;看了有点懵&#xff0c;所以去了解了一下 二、什么是Top-5和Top-1准确率与错误率 举个例子&#xff1a; 我们在训练完某个分类网络后&#xff0c…

【单目3D】在自动驾驶中将 2D 物体检测提升到 3D

Lifting 2D object detection to 3D in autonomous driving 单目 3D 目标检测使用 RGB 图像来预测目标 3D 边界框。由于 RGB 图像中缺少关键的深度信息&#xff0c;因此该任务从根本上说是不适定的。然而在自动驾驶中&#xff0c;汽车是具有&#xff08;大部分&#xff09;已知…

一文通吃:从 ZooKeeper 一致性,Leader选举讲到 ZAB 协议与 PAXOS 算法(上)

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"或慕课网公众号&#xff01; 作者&#xff1a;大能 | 慕课网讲师 本文将从ZooKeeper集群如何保证一致性&#xff0c;讲到zookeeper保证数据一致性的协…

打开docker-desktop报错问题解决

打开Ubuntu出现报错 Installing, this may take a few minutes... WslRegisterDistribution failed with error: 0x80070424 Error: 0x80070424 ????????? Press any key to continue... 命令行打开wsl出现报错 C:\Users\jiangcheng>wsl 指定的服务未安装。 Err…

windows环境下编译aws-sdk-cpp踩坑记

目录 1 前言 2 第一次编译 3 第二次编译 3.1 安装配置vcpkg 3.2 升级PowerShell 3.3 升级Cmake版本 3.4 vcpkg编译aws-sdk-cpp 4 工具合集下载 5 参考文献 1 前言 在做图片、视频片段存储技术调研时&#xff0c;从查阅的大量资料中&#xff0c;了解到很多人推荐的开源…

多层网关已成过去,网关多合一成潮流,网关改造正当时丨Higress 正式发布 1.0 版本

作者&#xff1a;Higress 团队 01 前言 K8s 通过 Ingress / Gateway API 将网关标准化&#xff0c;逐步将安全网关、流量网关、微服务网关内聚&#xff0c;解决从单体到微服务到云原生多层网关的复杂度&#xff0c;合久必分&#xff0c;分久必合&#xff0c;多层网关已成过去…

第21章 JQuery DataTables对角色的渲染显示

1 Services.Customers.CustomerServiceDefaults /// <summary> /// 【1个指定用户所对应的所有角色缓存键】 /// <remarks> /// 摘要&#xff1a; /// 设定一个缓存键实例&#xff0c;用于拼接1个指定的缓存键字符串&#xff0c;该缓存键字符与角色实体所有实例…

量化多因子——描述数据(空值、重复值、异常值)

数据清洗是量化的第一步&#xff0c;也是非常关键的一步。 检查数据的空值、重复值、异常值&#xff0c;并进行描述性数据分析&#xff0c;观察数据的分布情况。 缺失值&#xff1a; return_all.info() np.where(np.isnan(return_all)) np.where(np.isinf(return_all)) 重复值&…

基础巩固(五)Android通过WebView与Js交互

文章目录 简介WebView基本使用常用方法WebView的生命周期 / 状态切换关于前进 / 后退网页清除缓存数据 常用类WebSettings类常见用法&#xff1a;设置WebView缓存 WebViewClient类WebChromeClient类 注意事项如何避免WebView内存泄露 使用案例 通过WebView使得native与Js交互An…

k8s安装部署

1、基础环境 所有机器执行以下操作 hostname ipk8s-master192.168.0.121k8s-node1192.168.0.102k8s-node2192.168.0.160 docker version&#xff1a;20.10.7 k8s相关插件version&#xff1a;1.20.9 #各个机器设置自己的域名 hostnamectl set-hostname xxxx# 将 SEL…

Java中令人惊艳的五大算法,你知道多少?

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Golang - 选项模式 vs 构建器模式

在使用Golang创建复杂对象时&#xff0c;常用的两种模式是选项模式&#xff08;Options pattern&#xff09;和构建器模式&#xff08;Builder pattern&#xff09;。这两种模式各有优缺点&#xff0c;选择适合项目需求的模式取决于具体情况。 问题 假设我们想创建一个具有许…

【HTTP 协议】掌握 Web 的核心技术

哈喽&#xff0c;大家好~我是你们的老朋友&#xff1a;保护小周ღ 谈起 HTTP 协议&#xff08;超文本传输协议&#xff09;&#xff0c;不知道大家第一次是从什么地方了解到这个协议的呢&#xff1f;在真实的网络环境中网络协议的种类非常多&#xff0c;其中有一些耳熟能详的…

GBASE南大通用5月份公司动态一览

产品动态 5月初&#xff0c;GBASE南大通用两款新产品&#xff1a;GBase 8c V5.0和GBase 8s V8.8.5于鲲鹏开发者大会主论坛商业发行版联合发布仪式上正式发布。新版本与上一版本功能特性保持兼容&#xff0c;并在算子能力、用户级别审计、兼容性等方面全面增强&#xff0c;支持一…

最新版本 Stable Diffusion 开源 AI 绘画工具之微调模型篇

✨ 目录 &#x1f388; 模型种类&#x1f388; 变分自动编码器 / VAE&#x1f388; 美学梯度 / Aesthetic Gradients&#x1f388; 大型语言模型的低阶自适应 / LoRA&#x1f388; 超网络模型 / Hypernetwork&#x1f388; 微调模型 / LyCORIS &#x1f388; 模型种类 当你打开…

jacoco检测功能或自动化测试覆盖率

参考文档&#xff1a;http://t.csdn.cn/QqCSh http://t.csdn.cn/HonVL 目录 下载jacoco 启动jacocoagent监控被测项目 执行手工测试 生成exec文件 生成report报告 jacoco代码覆盖率报告分析 下载jacoco http://t.csdn.cn/HonVL 我下载的最新的 jacoco-0.8.10.zip 下…

虚拟化技术 — Cgroups 与 Namespaces 支撑实现的操作系统虚拟化

目录 文章目录 目录操作系统虚拟化&#xff08;容器技术&#xff09;的发展历程ChrootCgroupsCgroup SubsystemsCgroup FilesystemCgroup HierarchyCgroups 的操作规则Cgroups 的代码实现 NamespacesUTS namespacePID namespaceIPC namespaceMount namespaceNetwork namespaceU…