Linux编译器gcc/g++

2023-11-17

目录

一、关于gcc/g++

程序翻译的过程

①预处理:

②编译:

③汇编:

④链接:

二、gcc的使用

gcc的常见命令

①-E

②-S

③-c

三、动静态库

四、make、Makefile


一、关于gcc/g++

首先,在我们自己的云服务器中,运行gcc -v、g++ -v如果能运行出来,就说明我们装了这两个工具,如果有的g++ -v 没有运行出来,只需要sudo yum install -y gcc-c++(sudo的前提是普通用户被添加到了信任列表中,即在root用户下输入vim /etc/sudoers后,110行左右那个%wheel ALL=ALL那行复制一下,并在复制那行的开头改为你的用户名,从而添加为信任列表)

完成gcc和g++的安装后,即可进行相关操作

gcc是一个专门用来编译链接C语言的编译器,g++是编译链接C++的编译器(g++也可以编译C语言)

程序翻译的过程

程序翻译也就是将文本模式的C语言转化为计算机二进制语言

有四步:预处理、编译、汇编、链接

①预处理:

预处理主要有四步(不止四步)

去注释;宏替换;头文件展开;条件编译等等

②编译:

编译是将C语言转化为汇编语言

③汇编:

汇编是将汇编语言转化为可重定向二进制目标文件

④链接:

链接是将多个.o/.obj合并为一个可执行文件(.exe)

当然gcc/g++也会遵守上面的四个步骤

二、gcc的使用

g++和gcc的使用一模一样,所以下面只演示了gcc,g++以此类推就行

一步到位的方式,直接将C文件变为可执行文件:

创建一个test.c文件,vim一个简易的C语言代码

直接输入gcc test.c -o test

就有了最终的可执行程序test

gcc test.c -o test中-o 后面跟的文件名称就是我们自己命名的可执行程序的名称


gcc的常见命令

首先我们vim一个test.c

test.c里面包含了注释,宏,头文件,条件编译,主要是为了方便我们后续观察这几种经过预处理后的结果


①-E

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

同样可以理解为-o后面跟的文件名称就是形成的文件的名称,即test.i就是test.c预处理之后的所形成的

然后vim test.i观察预处理后的结果:

在test.i文件的最后,我们可以观察到test.i和test.c的区别很大

首先注释消失了,头文件展开了,宏Max直接变为100在printf里了,条件编译也没有了

并且我们可以发现,行数非常多,有800多行,而我们的test.c只有18行,这时因为头文件stdio.h展开了,而头文件stdio.h中也包含了其他头文件,所以展开会非常多


②-S

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

即形成了汇编语言就停下来

vim test.s可以看到汇编语言:


③-c

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

这里的test.o叫做可重定向二进制目标文件


这里的test.o还不能被执行,那么我们想执行,进行如下操作:

形成了可执行文件test

这一步就叫做链接过程


三、动静态库

一般链接的过程是有两种方式的:

一是动态链接--》需要动态库

二是静态链接--》需要静态库

在Linux中,.so结尾(动态库);.a结尾(静态库)

在Windows中,.dll结尾(动态库);.lib结尾(静态库)

ldd + [文件名称]可以查看文件

框出来就是所需的库


file + [文件名称]可以查看文件具体信息

可以看到多少位的可执行程序,还有动态链接之类的信息

所以可以得知,gcc,g++所用的链接是动态链接的


动态链接:将库中我要的方法的地址,填入我的可执行程序中,建立关联(节省资源)

静态链接:将库中方法的实现,拷贝到我们的可执行程序中(占用资源)


gcc中正常编译出test的可执行程序

通过ldd和file可以观察得知是动态链接的

如果我们想静态链接,就在gcc test.c -o [文件名称]后面加-static

-static表示使用静态链接的方式形成可执行程序

有些机器在加-static时可能会报错,是因为没有安装静态库

安装C语言静态库的指令:sudo yum install -y glibc-static

安装C++静态库的指令:sudo yum install -y libstdc++-static

安装完成后,执行相应的操作:

可以发现,使用静态链接的文件大小相比于使用动态链接的文件大小,大了十倍左右,所以上面说到比较占用资源


四、make、Makefile

项目自动化构建工具:make、Makefile

make是一个命令

Makefile是一个文件

所以我们可以编写Makefile,包含依赖关系和依赖方法

第一行test是目标文件名称,冒号后面是依赖文件test.c

第二行必须Tab开头,然后使依赖方法

这时我们保存退出后,如果想编译test.c,直接make

这时就形成了可执行的目标文件test

构建有了,也得有清理,所以继续vim Makefile

.PHONY相当于一个关键字,在PHONY后面的称为伪目标,下一行还是依赖方法

所以构建输入make,清理输入make clean 即可

在执行make时只会执行第一个遇到的目标文件,所以我们的下面的这个Makefile

第一个遇到的是gcc对应的目标文件,如果想执行下面的clean需要在make后面加上clean

所以如果我们不想执行第一个遇到的目标文件,就只需要在make后面带上名字即可


上面说到PHONY后面的称为伪目标,为伪目标是总是被执行的

当我们执行make时,第一次会执行,在输入make就不会执行了,提示已经是最新的了(这是根据文件的最新修改时间判断的)

而当我们执行伪文件时:

不管我们输入几次,都会执行,所以称之为总是被执行的

所以我们通常习惯给clean设置.PHONY


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

Linux编译器gcc/g++ 的相关文章

  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • Linux 中什么处理 ping?

    我想覆盖 更改 linux 处理 ping icmp echo 请求数据包的方式 这意味着我想运行自己的服务器来回复传入的 icmp 回显请求或其他 数据包 但为了使其正常工作 我想我需要禁用 Linux 的默认 ping icmp 数据包
  • C语言中如何通过内存地址映射函数名和行号?

    如何用 GCC 中的内存地址映射回函数名称和行号 即假设一个 C 语言原型 void func Get the address of caller maybe this could be avoided MemoryAddress get
  • 为什么我可以直接从 bash 执行 JAR?

    我是一个长期从事 Java 工作的人 并且知道运行带有主类的 JAR 的方法MANIFEST MFJar 中的文件很简单 java jar theJar jar 我用它来启动 Fabric3 服务器 包含在bin server jar在其标
  • docker容器大小远大于实际大小

    我正在尝试从中构建图像debian latest 构建后 报告的图像虚拟大小来自docker images命令为 1 917 GB 我登录查看尺寸 du sh 大小为 573 MB 我很确定这么大的尺寸通常是不可能的 这里发生了什么 如何获
  • 如何确保应用程序在 Linux 上持续运行

    我试图确保脚本在开发服务器上保持运行 它会整理统计数据并提供网络服务 因此它应该会持续存在 但一天中有几次 它会因未知原因而消失 当我们注意到时 我们只需再次启动它 但这很麻烦 并且某些用户没有权限 或专有技术 来启动它 作为一名程序员 我
  • Linux 上的用户空间能否实现本机代码的抢占式多任务处理?

    我想知道是否可以在 Linux 用户空间的单个进程中实现本机代码的抢占式多任务处理 也就是说 从外部暂停一些正在运行的本机代码 保存上下文 交换到不同的上下文 然后恢复执行 所有这些都由用户空间精心安排 但使用可能进入内核的调用 我认为这可
  • “make install”将库安装在 /usr/lib 而不是 /usr/lib64

    我正在尝试在 64 位 CentOS 7 2 上构建并安装一个库 为了这个目的我正在跑步 cmake DCMAKE BUILD TYPE Release DCMAKE INSTALL PREFIX usr DCMAKE C COMPILER
  • php exec 返回的结果比直接进入命令行要少

    我有一个 exec 命令 它的行为与通过 Penguinet 给 linux 的相同命令不同 res exec cd mnt mydirectory zcat log file gz echo res 当将命令直接放入命令行时 我在日志文件
  • 如何减去两个 gettimeofday 实例?

    我想减去两个 gettimeofday 实例 并以毫秒为单位给出答案 这个想法是 static struct timeval tv gettimeofday tv NULL static struct timeval tv2 gettime
  • Linux - 从第二个选项卡获取文本

    假设我们有这样的文件 一些文本11 一些文本12 一些文本13 一些文本21 一些文本22 一些文本23 文本由制表符分隔 我们知道第 1 列中的一些文本 但希望从第 2 列中获取文本 我知道我可以通过以下方式获取线路 grep somet
  • 我如何知道 C 程序的可执行文件是在前台还是后台运行?

    在我的 C 程序中 我想知道我的可执行文件是否像这样在前台运行 a out 或者像这样 a out 如果你是前台工作 getpgrp tcgetpgrp STDOUT FILENO or STDIN FILENO or STDERR FIL
  • 进程退出后 POSIX 名称信号量不会释放

    我正在尝试使用 POSIX 命名信号量进行跨进程同步 我注意到进程死亡或退出后 信号量仍然被系统打开 在进程 打开它 死亡或退出后是否有办法使其关闭 释放 早期的讨论在这里 当将信号量递减至零的进程崩溃时 如何恢复信号量 https sta
  • Fortran gfortran linux 中的“分段错误(核心转储)”错误

    我正在创建一个程序 该程序将分析目录中的文件 fits 然后它将在另一个目录中创建另一个文件 txt 它只是一个转换器 当我尝试执行该程序 编译正常 时 它给了我一条错误消息 程序收到信号 SIGSEGV 分段错误 无效的内存引用 此错误的
  • NUMA 在虚拟内存中是如何表示的?

    有许多资源 https en wikipedia org wiki Non uniform memory access从硬件角度描述NUMA的架构性能影响 http practical tech com infrastructure num
  • 捕获实时流量时如何开启纳秒精度?

    如何告诉 libpcap v1 6 2 将纳秒值存储在struct pcap pkthdr ts tv usec 而不是微秒值 捕获实时数据包时 Note This question is similar to How to enable
  • 警告:请求的映像平台 (linux/amd64) 与检测到的主机平台 (linux/arm64/v8) 不匹配

    警告 请求的映像平台 linux amd64 与检测到的主机平台 linux arm64 v8 不匹配 并且未请求特定平台 docker 来自守护程序的错误响应 无法选择具有功能的设备驱动程序 gpu 我在 mac 上尝试运行此命令时遇到此
  • 让 TeXstudio 在 linux mint 中工作:找不到文件“url.sty”。

    刚刚切换到 Linux Mint 以前的顽固 Windows 用户 我在尝试安装 TeXstudio 时遇到一些问题 Sudo apt get install texstudio 给了我一个正确的安装 至少 我是这么认为的 但是当我尝试构建
  • Fedora dnf 更新不起作用?

    当我尝试使用 update 命令更新 Fedora 22 时 sudo dnf update 我收到以下错误 错误 无法同步存储库 更新 的缓存 无法准备内部镜像列表 Curl 错误 6 无法解析主机名 无法解析主机 mirrors fed
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 04-JavaWeb-使用Servlet+JSP+JDBC实现CRUD

    一 介绍 在掌握了JavaAPI HTML Servlet JSP JDBC等知识后 咱们利用这些知识点 打通从前端页面到后端Java 再到数据库的各个环节 通过实现一个员工的CRUD来巩固一下相关知识 项目架构如下 实现功能如下 员工列表
  • CMD之拷贝文件夹

    左右无空格 SET srcdir protobuf IDL SET dstdir install proto Y 取消提示以确认要覆盖 E 复制目录和子目录 包括空目录 I 如果目标不存在 且要复制多个文件 则假定目标必须是目录 Q 复制时
  • ES6知识点总结一:const、let、箭头函数

    1 ES6常量及变量的声明const let ES6 新增了let命令来声明变量 const用来声明常量 ES6新增的let和const拥有 块级作用域 ES5只有 全局作用域 和 函数作用域 const与var区别 var声明的变量可以重
  • 如何将本地项目上传到git仓库中

    如何将本地项目上传到git仓库中 1 打开github 新建一个仓库用来存放项目 2 复制创建仓库链接 https github com WQ181 qiji git 3 找到要上传的项目文件 比如 qj consult就是我要上传到仓库上
  • python-turtle画图

    认识Turtle Turtle是一个渲染器 基于底层图形编程结构 API 构建 主要用于场景的构建以及3D物体的绘制 3D游戏 虚拟场景等 Turtle是一个窗体程序 Turtle是Python语言中的一个很流行的绘制图像的函数库 想象一个
  • js表单案例

    js表单案例 包括阻止提交的默认行为 添加节点操作以及删除节点操作等等
  • 逻辑思维训练1200题-蓝桥杯计算思维参考

    黑格尔曾说过 逻辑是一切思考的基础 逻辑思维能力强的人能迅速 准确地把握住问题的实质 面对纷繁复杂的事情能更容易找到解决的办法 逻辑思维训练1200 题 介绍了排除法 递推法 倒推法 作图法 假设法 计算法 分析法 类比法 推理法 判断法
  • 记录下:解决fatal error: sqlite3.h: No such file or directory

    编译sqlite3数据库c语言程序时出现fatal error sqlite3 h No such file or directory 找不到头文件的问题 原来是系统没有安装函数库 执行下面语句解决 sudo apt get install
  • Linux服务器上配置Jupyter并在后台运行

    使用工具 Xshell作为终端 Python3 版本 Xmanager打开Linux图形浏览器 第一步 安装Jupyter pip3 install i https pypi douban com simple jupyter 如果己安装好
  • 用户信息表(查询数据 、 修改密码 、 添加数据)

    效果 列表的数据 添加用户的效果 修改用户表
  • Excel读取返回List<Map>工具方法

  • cocos2d-x

    http www myexception cn operating system 1222879 html http www tuicool com articles zQ3Q7n http www myexception cn opera
  • 服装商城小程序制作:打造便捷购物体验和提升销售额的利器

    随着移动互联网的发展 服装商城小程序成为各大服装品牌推广销售的重要工具 它不仅能够为用户提供便捷的购物体验 还能帮助服装商城实现更高效的销售和管理 下面给大家介绍下服装商城小程序的优点以及制作流程 让您了解并充分利用这一利器 优点 便捷购物
  • 云端部署code-server

    code server下载地址 GitHub coder code server VS Code in the browser 操作环境 本文配置环境为 aliyun ECS Debian 11 5 准备工作 Xftp 阿里云ECS云服务器
  • 算法--吃火锅

    题目 和朋友一起吃火锅 有m个菜品 你的手速是n 即吃完一道菜 要经过时间n才能再去夹菜 任一菜品下锅后 都需要经过对应时间才能熟 过时就不可口了 怎样可以吃到最多的可口的菜 输入 第1行 菜品数量m 手速n 第2 m行 每行两个数字 第一
  • 所有的USB C 设备都需要CC芯片吗

    所有的DFP 如电源适配器 所有的DRP 如电脑 手机 平板 移动电源 所有需要检测DFP电流输出能力的UFP 所有支持PD的设备 都需要CC逻辑检测与端口控制芯片 换句话说 只有因为功耗较低而不需要检测电流能力的UFP U盘 耳机 鼠标等
  • 第五届蓝桥杯校内选拔赛试题java组_2014年第五届蓝桥杯国赛试题(JavaA组)

    1 结果填空 满分15分 2 结果填空 满分45分 3 代码填空 满分30分 4 程序设计 满分30分 5 程序设计 满分80分 6 程序设计 满分100分 1 标题 海盗分金币 有5个海盗 相约进行一次帆船比赛 比赛中天气发生突变 他们被
  • 【经典分割网络】网络+模块+数据集+实验结果(整理中。。

    KolektorSDD数据集中包 含了 50组电子换向器图片 其中每组包含 8张图 片以及对应的语义分割标签 图像宽均为 500像 素 高为 1 240 1 273像素 1 FCN 2 U net 3 PSPnet 4 deeplab 5
  • Kafka详解及面试常问问题

    Kafka 简介 Kafka 是一个分布式流式处理平台 这到底是什么意思呢 流平台具有三个关键功能 消息队列 发布和订阅消息流 这个功能类似于消息队列 这也是 Kafka 也被归类为消息队列的原因 容错的持久方式存储记录消息流 Kafka
  • Linux编译器gcc/g++

    目录 一 关于gcc g 程序翻译的过程 预处理 编译 汇编 链接 二 gcc的使用 gcc的常见命令 E S c 三 动静态库 四 make Makefile 一 关于gcc g 首先 在我们自己的云服务器中 运行gcc v g v如果能