[Linux开发工具]——gcc/g++的使用

Linux编译器——gcc/g++的使用

  • 一、快速认识gcc/g++
  • 二、程序的翻译过程
    • 2.1 预处理(.i文件)
    • 2.2 编译(.s文件)
    • 2.3 汇编(.o文件)
    • 2.4 链接(生成可执行文件或库文件)
  • 三、认识函数库
    • 3.1 静态库
    • 3.2 动态库库
    • 3.3 .dll(windows的动态库)缺失问题
    • 3.4 动静态库总结

一、快速认识gcc/g++

编译生成可执行程序的方法:
在这里插入图片描述
可以形成一个指定名称的可执行程序有两种方法:
在这里插入图片描述
C语言源程序即可以用gcc编译也可以用g++编译,方法都是一样得。
C++源程序只能用**g++**编译器进行编译。(用gcc编译会报错)

二、程序的翻译过程

为什么c生万物?
早期语言是二进制,发展成汇编语言(划时代的东西,操作系统和编译器等诞生),丹尼斯里奇设计了更方便的语言(c语言),后来出现的面向对象语言c++,Python等编译器都是C语言写得,java的虚拟机是c++写得,所以c生万物。
先有语言还是先有编译器?
先有语言在有编译器,这个语言比编译器要出现的早一下(用二进制写得汇编编译器)。
如图:
语言的自举过程
在这里插入图片描述
总结:
c->低级语言写一个c编译器->能形成软件
c编译器->c->低级语言写一个c编译器->形成了用c写的编译器
c->用c写的编译器->编译c语言
c编译器优化v2->用c写的编译器v1->v2编译器

2.1 预处理(.i文件)

预处理功能 主要包括宏替换,头文件包含展开(所谓的头文件展开,本质是在预处理的时候,将头文件的内容拷贝至源文件),条件编译,去注释等。
预处理指令是以 # 号开头的代码行 。
#防止头文件被重复包含,为什么?
通过条件编译,将重复的编译进行去掉 。(命令行定义:gcc hello.c -o hello.exe -D VERSIONI=1)

gcc -E hello.c -o hello.i// 从现在开始进行程序的翻译过程,当预处理做完的时候,就停下来。

在这里插入图片描述

选项 “-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件(object)。
“.i”文件为已经过预处理的C原始程序。

2.2 编译(.s文件)

在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言。

gcc -S hello.i -o hello.s //从现在开始进行程序的翻译过程,当编译工作做完,就停下来。

在这里插入图片描述

“-S” 选项进行查看,该选项只进行编译而不进行汇编,只生成汇编代码,并生成.s 文件 。

2.3 汇编(.o文件)

汇编阶段是把编译阶段生成的 “.s”文件 转成 目标文件 “-o”

gcc -c hello.s -o hello.o //从现在开始进行程序的翻译过程,当汇编工作做完,就停下来。

在这里插入图片描述

选项 “-c” 可看到汇编代码已转化为 “.o”的二进制目标代码
此时的形成的Linux下的 .o 二进制文件相当于windows下的 .obj可重定位目标二进制文件,是不可执行程序,因为还差一步链接的过程。

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

在成功汇编之后,就进入了链接阶段 。自己编写的代码也被打包成.o文件,库文件也是被打包成.o文件,最后将他们这两个.o文件进行链接。

gcc hello.o -o hello //自己编写的代码被打包成.o文件,库文件也被打包成.o文件,最后将他们这两个.o文件进行链接。

在这里插入图片描述

三、认识函数库

我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?

答案是:系统把这些函数实现都被列到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。

在这里插入图片描述
查看Linux下的头文件:

ls /usr/include/

在这里插入图片描述

库的区分:
在这里插入图片描述

3.1 静态库

静态库是指编译链接时,把库文件的代码全部加入拷贝到可执行文件中 ,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名 一般为 “.a”。

3.2 动态库库

与静态库相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时,运行链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so” ,如前面所述的 libc.so.6 就是动态库 。

3.3 .dll(windows的动态库)缺失问题

被多个使用者共享使用,一旦缺失,所有程序都不可以运行了!!
在这里插入图片描述

.dll(windows的动态库)缺失的可能场景:
1.在链接的时候,病毒对你的代码进行了修改(病毒:对库进行恶意替换),当链接时对应的库文件.dll进行链接时,可执行程序就可以跑起来了,就可以对你的文件进行任意的修改了 。
2.杀毒扫描的是:系统之中可能隐藏的可执行程序 以及 各种静态库 。可能是在扫描过程中,扫描软件可能本身就存在各种bug,扫描的时候将你的库文件搞没了也是有可能的。

3.4 动静态库总结

1.函数库
函数库一般分为静态库动态库两种。
动静态库本质就是文件,头文件也是文件 。
2.动静态库优缺点
动态库:(动态链接)
优比较节省资源,不会出现太多的重复代码----资源磁盘,内存,网络等资源。
缺点:对库的依赖性比较强----旦库丢失,所有使用这个库的程序都无法运行。
静态库:(静态链接)
优:不依赖库,同类型平台中都可以直接运行使用。
缺点:可执行程序体积比较大,比较浪费资源----资源磁盘,内存,网络等资源
3.生成动静态库的命令

gcc -o myfile myfile.c //生成动态的文件,动态链接1
gcc -o myfile-static myfile.c -static //生成静态的文件,静态链接2

注意:如果linux里没有安装c/c++静态库, 进行2号操作会报错,这时候我们就要安装c/c++静态库。
安装静态库命令:

yum install -y glibc-static libstdc++ -static

查看是否安装:
在这里插入图片描述

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

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

相关文章

微调alpaca-lora遇到的一些问题

1、环境简介 环境: 系统:Ubuntu torch:2.2.1 python:3.10 gpu:V100 16g peft:0.9.0 使用PEFT中的lora方式微调llama-2-7b-hf,项目地址:alpaca-lora 2、混合精度训练Tensor相互计算会…

Linux hdparm命令教程:优化硬盘性能和读写速度(附实例详解和注意事项)

Linux hdparm命令介绍 hdparm 是一个用于控制和配置硬盘驱动器的命令行工具。它允许您查看和修改硬盘的参数,包括缓存设置、高级电源管理、硬盘性能等。通过 hdparm,您可以优化硬盘的读写速度和性能。 Linux hdparm命令适用的Linux版本 hdparm 在大多…

springboot/ssm小区家政服务预约平台统Java家政在线预约管理系统web

springboot/ssm小区家政服务预约平台统Java家政在线预约管理系统web 基于springboot(可改ssm)vue项目 开发语言:Java 框架:springboot/可改ssm vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库&#…

【RH134问答题】第十三章 运行容器(上)

系列文章 第一章 提高命令行生产效率 第二章 计划将来的任务 第三章 调优系统性能 第四章 使用ACL控制对文件的访问 第五章 管理SELinux安全性 第六章 管理基本存储 第七章 管理逻辑卷 第八章 实施高级存储功能 第九章 访问网络附加存储 第十章 控制启动过程 第十一章 管理网络…

Redis Lua脚本:赋予Redis更强大的逻辑与功能

Redis 脚本是一种用 Lua 编写的脚本,可以在 Redis 服务器端执行。脚本能够原子地执行多个 Redis 命令,并且通过 EVAL 和 EVALSHA 命令进行调用。Redis 脚本通常用于实现复杂的逻辑操作,例如事务、原子性操作和复杂的数据处理。 Redis脚本的详…

[json.exception.type_error.316] invalid UTF-8 byte报错

[json.exception.type_error.316] invalid UTF-8 byte at index 1: 解决方法重新编译程序即可。

六、大模型-Prompt-API介绍

GPT-3.5 API 提供了一个名为 openai.ChatCompletion.create() 的端点,您可以使用该端点来与 ChatGPT 进行交互。以下是 openai.ChatCompletion.create() 的详细 API 说明: 请求参数: messages:一个数组,包含对话中的消…

[接口生成] 1. 数据库生成

我们在做页面的时候, 一般都要和数据相适应,这个时候就需要去修改数据库, 至少需要数据库相关的人员配合, 改来改去的容易产生一些版本遗留问题。 就算是我一个人开发, 一会儿搞前端,一会儿搞后台&#xf…

Jupyter Notebook介绍、安装及使用教程

Jupyter Notebook介绍、安装及使用教程 一、什么是Jupyter Notebook?简介组成部分网页应用文档Jupyter Notebook的主要特点 二、安装Jupyter Notebook先试用,再决定安装安装前提使用Anaconda安装使用pip命令安装 三、运行Jupyter Notebook帮助启动默认端…

Python 解决大文件的写入但查看却生效不及时的问题

文章目录 1. 问题2. 原因3. 解决方法4. 补充 flush() 介绍4.1 语法4.2 说明4.3 示例4.4 使用场景 1. 问题 在写入大文件内容时,程序还没有结束,如下在运行: with open("xxx", "a") as f:... # 你的逻辑f.write("x…

macOS 通过 MacPorts 正确安装 MySQL 同时解决无法连接问题

如果你通过 sudo port install 命令正常安装了 MySQL,再通过 sudo port load 命令启动了 MySQL Server,此刻却发现使用 Navicat 之类的 GUI 软件无法连接,始终返回无法连接到 127.0.0.1 服务器。这是一个小坑,因为他默认使用了 So…

Linux创建软连接后,无法直接调用的原因和解决办法

我自己遇到的问题: 进入到主目录: cd 创建一个main软连接后: ln -s /home/user01/demo01.py main 执行: main 没反应。 试了下发现是调用方法的问题,因为main是主目录下的一个软链接,所以调用方式应该是&…

linux 串口通讯模板

RAW模式与非RAW模式 RAW 模式: 简单的来说,就是发送端发动的二进制码原封不动的被接收端接收。 若干年前使用Windows下的串口调试助手对单片机串口进行调试就是使用的 RAW 模式, 单片机发送的数据被原封不动的发送给 PC 端,PC 端…

零代码编程:用kimichat将srt字幕文件进行批量转换合并

文件夹里面有多个srt字幕文件,借助kimichat可以很方便的对其进行批量合并。 在kimichat中输入提示词: 你是一个Python编程专家,写一个Python脚本,完成一个处理整理文档内容的任务,具体步骤如下: 打开文件…

更新数据库表中的数据

目录 update 加上各种限制条件 update update 表名set 列名1xx,列名2xx 指定更新某列数据如果不添加where子句,则为全列更新 也可以在原有基础上更新: 注意,mysql语法里不支持,必须是列名列名数值 加上各种限制条件 比如加上order by子句,where子句,limit等 这些条件对于up…

【FLOOD FILL专题】【蓝桥杯备考训练】:扫雷、动态网格、走迷宫、画图、山峰和山谷【已更新完成】

目录 1、扫雷(Google Kickstart2014 Round C Problem A) 2、动态网格(Google Kickstart2015 Round D Problem A) 3、走迷宫(模板) 4、画图(第六次CCF计算机软件能力认证) 5、山…

政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(四)—— 过拟合和欠拟合

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 通过增加容量或提前停止来提高性能。 在深度学习中&#…

2024年奥莱利科技趋势报告解析

2024年O’Reilly技术趋势报告解读 概述 在快速发展的技术领域,跟上最新趋势对行业内的任何人来说都至关重要。2024年O’Reilly技术趋势报告在此方面提供了关键的指导,全面概述了最重要的技术进步和模式。该年度报告基于O’Reilly著名在线学习平台280万…

C#对于文件中的文件名判断问题

C#中对于文件名的判断问题,我们使用bool值进行值的传递,首先我们使用内置方法进行文件字符串匹配的bool值回传,我们打印出文件名以及相对应的bool,即可知道文件名是否真正生效 bool isHave fileName.Contains("Hello"…

shell和linux的关系

Shell 和 Linux 之间存在密切的关系,但它们并不是同一个东西。让我们分别了解一下它们: Linux: Linux 是一个自由和开放源代码的类UNIX操作系统。 Linux 的内核由林纳斯托瓦兹(Linus Torvalds)于1991年首次发布&…