【Linux学习】gcc与g++的使用与程序翻译的过程

news2024/12/25 12:38:00

文章目录

  • 修改sudo用户名单
  • gcc与g++指令
        • gcc用法
        • g++用法
  • 程序翻译的过程
  • 函数库
  • 动态库与静态库
      • 什么是动静态库?
      • 动静态库的优缺点
      • ldd指令


这里补充一个前面遗漏的知识:

修改sudo用户名单

  • 必须使用root超级用户进行修改,普通用户是不能访问修改。
  1. 输入指令打开相应的文件
# vim /etc/sudoers
  1. root 用户:
    在这里插入图片描述

  2. 在的对应位置修改,只需要将root那一行复制,然后粘贴在下面,将用户名修改成对应的即可。

  3. 其中,注意,退出的时候需要强制退出。切换成底行模式,输入wq!即可。


gcc与g++指令

g++与gcc的安装指令:

# yum install gcc
# yum install g++

其中,gcc与g++用法一样

gcc用法

注意:gcc只能编译C语言

用法一:执行后会默认在该目录下形成一个 a.out 的文件

# gcc + 文件名      

用法二:不想要默认的文件名,可以加选项 -o ,-o后面+生成指定文件
两种写法都可以:

# gcc -o 文件名M .c文件     //编译该.c文件,生成一个名为M的可执行文件
# gcc .c文件 -o 文件名M      //编译该.c文件,生成一个名为M的可执行文件
g++用法

注意:g++既可以编译C++,也可以编译C语言

用法一:执行后会默认在该目录下形成一个 a.out 的文件

# g++ + 文件名      

用法二:不想要默认的文件名,可以加选项 -o ,-o后面+生成指定文件
两种写法都可以:

# g++ -o 文件名M .c文件     //编译该.c文件,生成一个名为M的可执行文件
# g++ .c文件 -o 文件名M      //编译该.c文件,生成一个名为M的可执行文件

程序翻译的过程

扩展知识:语言的发展:二进制语言----->汇编语言----->C语言----->C++,java,shell等语言

问题:
先有语言还是先有该语言对应的编译器呢?先有汇编语言呢还是先有用汇编语言写的编译器呢?

假设现在有汇编语言,那么肯定是先有用二进制语言所写的能够编译汇编语言的编译器,该编译器能够把汇编语言翻译成二进制,才有的汇编语言。同样,第一个把c语言编译器,肯定是利用汇编语言所写能够让C语言变为汇编语言的编译器。这是语言和编译器的自举的过程。

程序翻译的过程,就是从其他语言翻译为计算机能够识别二进制语言的过程,和上面的语言发展方向相反。

以C语言为例:

一.预处理

主要工作:
a,头文件的展开:将头文件部分内容拷贝到源文件,有对应的拷贝条件
b,宏替换
c,去注释
d,条件编译

条件编译的用途:实现代码裁剪等等。

注意:经过了预处理,语言种类没有改变,例如:C语言预处理后,还是C语言

翻译时,预处理完成后停止:

方法一:
会将结果打印到显示屏上

# gcc -E 目标文件    
//-E::翻译的时候,在预处理完成后就停止

方法二:
将执行后的结果形成一个临时文件

# gcc -E 目标文件 -o XXX.i 文件

在这里插入图片描述
二.编译(生成汇编)

主要的工作
把其他语言 转为 汇编语言(如图)
在这里插入图片描述

翻译时,编译完成后停止:
方法:
将执行后的结果形成一个临时文件

# gcc -S 目标文件/预处理后生成的.i文件 -o XXX.s 文件

在这里插入图片描述

三.汇编(生成机器可识别代码)

主要工作:
汇编---->二进制(可重定位目标二进制文件) 注意:该文件是不能够执行的。
把其他语言 转为 汇编语言

翻译时,汇编完成后停止:
方法一:

# gcc -c 目标文件   //不指定,编译器会默认生成一个同名.o文件
//-c::翻译的时候,在汇编完成后就停止

方法二:指定文件

# gcc -c 目标文件 -o XXX.o的文件

在这里插入图片描述

四.链接(生成可执行文件或库文件)

主要工作:
将我们的可执行程序,与系统中的库建立联系。

例如:
我们所写的程序中,使用了库里面函数,并没有自己实现,这时就需要和库里面的函数建立联系;

命令:

# gcc -o code test.o   //不需要带选项,直接生成可执行程序code(可以自己命名)

在这里插入图片描述

函数库

我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。

动态库与静态库

库分为动态库与静态库,在linux中,动态库文件以.so结尾, 静态库以.a结尾。在windows中,动态库文件以.dll结尾, 静态库以.lib结尾。
库本质就是一个文件,里面包含了很多已经被编译好的代码。

什么是动静态库?

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。
动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。

动静态库的优缺点

动态库(链接方式:动态链接)
优点:比较节省资源,不会出现太多的重复代码 资源:磁盘,内存,网络等资源(例如:写了一个项目,里面有多个文件,这里文件中调用了很多个库里面的函数,虽然调用了很多函数,但是实现就只有一个,不会造成代码冗余的问题)
缺点:对库的依赖性强,一旦库出现问题,那么所有使用了该库的程序全部都无法运行。

静态库(链接方式:静态链接)
优点:不依赖库(因为静态链接是拷贝),可以在同类型平台中都直接运行。
缺点:体积比较大,比较浪费资源,会出现太多的重复代码 资源:磁盘,内存,网络等资源。

例子:
动态链接(编译器默认)
在这里插入图片描述
当我们改为静态链接时:

静态库的查看指令:

# ls /lib64/libc.a

C/C++静态库的安装:命令

# sudo yum install glibc-static libstdc++-static

在这里插入图片描述

Linux系统支持开发,因为提前在系统中安装了语言的标准头文件与库文件。
例如:
在Linux中,/libc.so.6为C语言标准库。

ldd指令

功能:可以查看一个可执行程序所依赖的库文件

用法:

# ldd 文件

示例:
在这里插入图片描述


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

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

相关文章

Spring 事务实现方式:

Spring 事务实现方式: Spring并不直接支持事务,只有当数据库支持事务的时候,Spring才支持事务,Spring只不过简化了开发人员实现事务的开发步骤 Spring事务的实现方式有两种: 一、基于申明式事务: Service…

CCF-CSP真题《202312-2 因子化简》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看:CCF-CSP真题附题解大全 试题编号:202312-2试题名称:因子化简时间限制:2.0s内存限制:512.0MB问题描述: 题目背景 质数(又称“素数”)是指…

安装AngusTester节点代理

一、介绍 节点代理程序(AngusAgent)提供三方面作用: 通过启动"执行器(AngusRunner)"来执行脚本任务。在代理节点上运行和管理Mock服务。收集、监控和报告关于节点的各种指标和性能数据,该数据用于在稳定性测试中可分析节点资源使用率。 二、…

Java高阶私房菜:高并发之线程池底层原理学习

以往我们需要获取外部资源(数据源、Http请求等)时,需要对目标源创建链接对象,三次握手成功后方可正常使用,为避免持续的资源占用和可能的内存泄漏,还需要调用目标对象close方法释放资源销毁对象。这一建一销…

【PCL】教程conditional_euclidean_clustering 对输入的点云数据进行条件欧式聚类分析...

[done, 3349.09 ms : 19553780 points] Available dimensions: x y z intensity 源点云 Statues_4.pcd 不同条件函数output.pcd 【按5切换到强度通道可视化】 终端输出: Loading... >> Done: 1200.46 ms, 19553780 points Downsampling... >> Done: 411…

ssm064农产品仓库管理系统系统+jsp

农产品仓库管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本农产品仓库管理系统就是在这样的大环境下诞生,其可以帮助管理者…

Llama 3“智商”测试:英文提示表现亮眼,中文不完美但差强人意!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识…

C++从入门到精通——C++动态内存管理

C动态内存管理 前言一、C/C内存分布分类1分类2题目选择题sizeof 和 strlen 区别示例sizeofstrlen 二、C语言中动态内存管理方式malloc/calloc/realloc/free示例例题malloc/calloc/realloc的区别malloc的实现原理 三、C内存管理方式new/delete操作内置类型new和delete操作自定义…

zabbix自定义监控、自动发现和注册以及代理设置

前言 监控项的定制和新设备的注册往往需要大量手动操作,这会导致维护成本的增加和监控效率的降低。本文将介绍如何利用 Zabbix 的自定义功能,实现监控项的动态发布和新设备的自动注册以及代理设置、从而简化运维工作并实现更高效的监控管理。 Zabbix 监…

LearnOpenGL(二)之三角形

一、重要概念 顶点数组对象:Vertex Array Object,VAO顶点缓冲对象:Vertex Buffer Object,VBO元素缓冲对象:Element Buffer Object,EBO 或 索引缓冲对象 Index Buffer Object,IBO 以数组的形式…

【简单介绍下R-Tree】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

单链表的实现(单链表的增删查改)

在顺序表中实现数据的增删的操作时,都要把操作位置之后的数据全部移动一遍,操作效率低下。其次是容量固定(静态顺序表),虽然在动态顺序表中容量可变,但也会造成空间上的浪费。 单链表就完美解决了上述缺点…

.net8系列-02图文并茂手把手教你编写增删改查接口

前情提要 接上篇文章,我们的应用已经创建完毕了,接下来我们编写几个自己的接口 快速开始 新增Controller 复制一份WeatherForecastController.cs,改名为CommonInfoController 设置Class名 将CommonInfoController中的复制过来的class名改成新名 …

对称二叉树 - LeetCode 热题 39

大家好!我是曾续缘🤎 今天是《LeetCode 热题 100》系列 发车第 39 天 二叉树第 4 题 ❤️点赞 👍 收藏 ⭐再看,养成习惯 对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入&#…

vue3图片展示实战

首先得有一个vue3项目 教程: vue3项目搭建 我测试存在两种方式可以将本地图片进行展示到页面 public文件夹下可以直接导入src下的asset文件夹下得图片需要在 script 标签内声明再导入网页图片不可导入,应该是存在一种限制 1,创建文件demo1I…

ICLR 2024 | FTS-Diffusion: 用于合成具有不规则和尺度不变模式的金融时间序列的生成框架

ICLR 2024 | FTS-Diffusion: 用于合成具有不规则和尺度不变模式的金融时间序列的生成框架 原创 QuantML QuantML 2024-04-17 09:53 上海 Content 本文提出了一个名为FTS-Diffusion的新颖生成框架,用于模拟金融时间序列中的不规则和尺度不变模式。这些模式由于其独…

桌面软件使用到的开源库

想了解一下桌面软件开发中可能使用到的dll库 联想锁屏 libcef-常用概念-框架特点-CSDN博客 libcurl库使用详情、libcurl库的制作-CSDN博客 使用Cef和Qt做一个跨平台的多标签多窗口浏览器_cef3 多个标签-CSDN博客 cef 依赖的文件 libcef - Bigben - 博客园 (cnblogs.com) Q…

Cadence virtuoso 原理图创建边框

给原理图创建如下图的边框Creating a Sheet Border and Title edit-sheet size添加画布 选择画布尺寸,border size里面的A/B/C/D对应不同的画布尺寸。 添加好画布后,在edit-sheet tilte里面可以选择输入相关信息,如电路名称,日期&…

STM32 F103C8T6经验笔记15:国产芯片下载受限问题

今日使用DAP仿真器下载时的小问题: Not a genuine sT Device! Abort connection 错误:不是真正的ST设备!中止连接。 问题解释: 这是因为下载时软件给你检测出这不是他们的正版芯片了,然后我查看了一下之前的购买记…

项目管理-项目范围管理

目录 一、概述 二、范围计划的编制 2.1 项目中包含的范围 2.1.1 产品范围 2.1.2 工作范围 2.1.3 总结 2.2 范围计划编制的成果 2.2.1 范围管理计划 2.2.1.1 概述 2.2.1.2 内容 三、创建工作分解结构 3.1 概述 3.2 WBS目的和用途 3.3 WBS分层结构 3.3.1 分层结构图…