【Linux系列P5】gccg++与【动静态库】的美妙邂逅

前言

  • 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎!
  • 本章主要内容面向接触过Linux的老铁,主要内容含

欢迎订阅 YY 滴Linux专栏!更多干货持续更新!以下是传送门! 

订阅专栏阅读:YY的《Linux》系列 ❀❀❀❀❀
【Linux系列-P1】 Linux环境的搭建
【Linux系列-P2】Linux的基本知识与指令
【Linux系列-P3】Linux的权限
【Linux系列-P4】Linux基本工具[yum][vim]

目录

 

一.底层知识点

二.函数库

1.库的基础知识

2.库的命名规则(会识别即可)

三.Linux编译器-gcc/g++使用

1. gcc/g++是什么?

2.gcc/g++的作用效果是什么?

3.gcc/g++ 怎么使用?选项有哪些?怎么记忆?

四.使用g++指令控制【翻译】各个过程

1.预处理(进行宏替换)

2.编译(生成汇编)

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

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

五.【.obj文件】与库的链接

1.【动态库/动态链接】与【静态库/静态链接】

2.编译形成可执行程序,默认采用【动态链接】 

3.【-static】选项&【动静态库细节】


一.底层知识点

引入:在我们在Window或者Linux系统上进行C/C++及其它形式的开发时,我们可能会有这样的疑问————这一过程是如何得以实现的?

  • 其实在我们的系统中,已经提前有了C++或者其他语言开发相关的头文件,库文件
  • 也就是说,C++开发环境不仅仅指的是vscode,gcc,g++,更为重要的是,系统是否含有语言本身的头文件和库文件
  • 当我们安装vscode等编译器时,我们会发现,其会让我们选择对应的开发包,其中就包括C的头文件和库文件

二.函数库

1.库的基础知识

引入:

  • 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而 没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
  • 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到 系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函 数“printf”了,而这也就是链接的作用
  • 链接的过程发生在预处理阶段,而【库】的作用是——提供链接方法的实现
  • 库,其实就是把多个源文件(.c文件),经过一定的翻译,然后打包————到最后只提供给我们一个文件;
  • C语言的标准库本质是一个文件有路径;
  • 我们可以得到这样一个等式:我们的软件=我们的代码+库文件提供方法的实现;

2.库的命名规则(会识别即可)

引入:在我们的机器上,默认会安装动态库,静态库默认是没有安装的

例:我们能找到这样的文件名——libname.so.XXX 

Linux

  • .so(动态库)
  • .a(静态库)

Windows

  • .dll(动态库)
  • .lib(静态库) 

三.Linux编译器-gcc/g++使用

1. gcc/g++是什么?

  • gcc 是GNU Compiler Collection,原名为Gun C语言编译器,因为它原本只能处理C语言,但gcc很快地扩展,包含很多编译器(C、C++、Objective-C、Ada、Fortran、 Java),可以说gcc是GNU编译器集合;
  • 注意点:g++既可以处理C/C++语言,而gcc只能处理C语言;一般我们使用g++即可;

2.gcc/g++的作用效果是什么?

  • 作用:gcc/g++就是将包含了代码的文本文件编译(预处理、编译、汇编、链接)成可执行的文件。然后我们才能执行;比如我们写了一段代码 (名为a.cpp),你可以用任意文本编辑软件来写,不需要非是IDE

3.gcc/g++ 怎么使用?选项有哪些?怎么记忆?

gcc [选项] 要编译的文件 [选项] 目标文件在下文中有关于选项更详细的实操

gcc选项:

  • -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
  • -S  编译到汇编语言不进行汇编和链接
  • -c  编译到目标代码
  • -o 文件输出到 文件
  • -static 此选项对生成的文件采用静态链接
  • -g 生成调试信息。GNU 调试器可利用该信息。
  • -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
  • -O0
  • -O1
  • -O2
  • -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
  • -w  不生成任何警告信息。
  • -Wall 生成所有警告信息。

关于选项的记忆窍门

  •  ESc,iso
  • 【键盘左上角ESC键】,【ios系统反后面俩个iso】

四.使用g++指令控制【翻译】各个过程

引入:g++控制过程的原理可以理解为一个截断阀(.c文件)从现在开始进行程序的翻译

  • -E表示将预处理工作做完就停下来,生成(.i文件)
  • -S表示将编译工作做完就停下来,生成(.s文件)
  • -c表示将汇编工作做完就停下来,生成(.o文件)

1.预处理(进行宏替换)

  • 预处理功能主要包括宏定义,文件包含,条件编译(得到不同版本软件),去注释等。
  • 预处理指令是以#号开头的代码行。
  • 实例: 
    gcc –E hello.c –o hello.i
  • 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
  • 选项“-o”是【指向目标文件】,“.i”文件为已经过预处理的C原始程序。

2.编译(生成汇编)

  • 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查 无误后,gcc 把代码翻译成汇编语言。
  • 用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
  • 实例: 
    gcc –S hello.i –o hello.s

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

  • 汇编阶段是把编译阶段生成的“.s”文件转成目标文件
  • 读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码
  • (.o文件)目标文件即(.obj文件),(.obj文件)不可以独立执行,还需要进行链接
  • 实例: 
    gcc –c hello.s –o hello.o

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

  • 在成功编译之后,就进入了链接阶段
  • (.o文件)和库(动态库/静态库)链接形成可执行程序
  • 实例: 
    gcc hello.o –o hello

五.【.obj文件】与库的链接

1.【动态库/动态链接】与【静态库/静态链接】

  • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时 链接【文件加载库】,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态 库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。
     gcc hello.o –o hello
  • 静态库是指编译链接时,把库文件的代码全部加入到【可执行文件】中,因此生成的文件比较大,但在运行时也 就不再需要库文件了。其后缀名一般为“.a”

2.编译形成可执行程序,默认采用【动态链接】 

  • 在Linux中,gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证

3.【-static】选项&【动静态库细节】

  • 在Linux中,如果要按照静态链接的方式进行形成可执行程序,需要添加-static选项】(提供静态库) ,例如
gcc mycode.c -o mycode -static
  • 但是如果我们没有静态库,就要强制-static,是不能实现的;由此我们可以看出,-static的本质:改变(.o文件)与库链接的优先级,优先级:动态库>静态库;
  • 不一定是纯的全动态/静态库,一般是动静态库混合的;

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

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

相关文章

快速部署K8s仪表板,助力管理轻松搞定!

https://kubernetes.io/zh-cn/docs/tasks/access-application-cluster/web-ui-dashboard/ Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。 你可以使…

CaffeineCache+Redis 接入系统做二层缓存思路实现(借鉴 mybatis 二级缓存、自动装配源码)

本文目录 前言本文术语本文项目地址设计思路开发思路DoubleCacheAble 双缓存注解(如何设计?)动态条件表达式?例如:#a.id?(如何解析?)缓存切面(如何设计?&…

async异步任务_同步任务选项

需要先看完上文:async创建异步任务_御坂美琴1的博客-CSDN博客 让类里面的一个成员函数当作线程的参数。 async里面有三个参数,一个是成员函数的地址,第二个是 类,第三个是传入的参数。 接下来介绍async的同步线程创建。 asy…

华为云Classroom一站式教学实践平台,开启云端教学新征程

随着高考落下帷幕,各高校将迎来新一届大学新生入学,他们的学长学姐们经过四年的学习,也即将步入社会,迈向一段新的人生旅程。 在这里小智先祝大家未来一切顺意,不忘初心,大鹏一日同风起,扶摇直…

Android跨平台语言分析

跨平台技术发展的三个阶段 第一阶段是混合开发的web容器时代 为了解决原生开发的高成本、低效率,出现了Hybrid混合开发原生中嵌入依托于浏览器的WebViewWeb浏览器中可以实现的需求在WebView中基本都可以实现但是Web最大的问题是,它的性能和体验与原生开发…

需求分析六步法

需求收集可能看起来不言自明,但它很少得到应有的充分关注。就像运动前伸展或睡前刷牙一样,这是一项经常被忽视的简单任务。 但是,忽视这些看似简单的事情的后果可能会导致伤害、蛀牙,或者在项目管理的情况下,导致项目…

qt调用图片并自适应界面大小显示

一、前言 记录qt使用图片打开、查看和关闭等操作 实现点击按键,打开选择的指定位置图片,有缩放显示,并可以点击放大按键放大图片,放大后图片自适应电脑窗口大小,大于窗口尺寸会根据最大宽和高缩放,小于窗…

【系统开发】尚硅谷 - 谷粒商城项目笔记(五):分布式缓存

文章目录 分布式缓存缓存使用场景redis作缓存中间件引入redis依赖配置redis堆外内存溢出 缓存失效问题缓存穿透缓存雪崩缓存击穿 Redisson分布式锁导入依赖redisson配置类可重入锁读写锁缓存一致性解决 缓存-SpringCache简介Cacheable自定义缓存配置CacheEvictCachePut原理与不…

Redis主从/哨兵机制原理介绍

目录 ​编辑 一、主从复制 1.1 什么是主从复制 1.2 主从复制的作用 1.3 主从复制原理 1.3.1 全量复制 1.3.2 增量复制 1.3.3 同步流程 二、哨兵机制 2.1 哨兵机制介绍 2.1.1 集群逻辑图 2.1.2 哨兵机制实现的功能 2.2 哨兵机制原理 2.2.1 监控 2.2.2 下线 2.2.2.1 下线流程 2.…

HarmonyOS学习路之开发篇—AI功能开发(文档检测校正)

基本概念 文档校正提供了文档翻拍过程的辅助增强功能,包含两个子功能: 文档检测:能够自动识别图片中的文档,返回文档在原图中的位置信息。这里的文档泛指外形方正的事物,比如书本、相片、画框等。文档校正&#xff1a…

Midjourney使用教程:三 图片风格提示

这里我根据现在的官方文档来继续我们的Midjourney的教程,看到这里如果你去实践的话,估计你已经有了好多张属于自己的图片。 这时候你不在满足简单的提示生成的Midjourney的默认风格图片,实际上你可以通过一些关键词做提示,来改变…

pcl基于八叉树进行空间划分和搜索操作

建立空间索引在点云数据处理中已被广泛应用,常见空间索引一般是自顶向下逐级划分空间的各种空间索引结构,比较有代表性的包括 BSP 树、KD 树、KDB 树、 R树、R树、CELL 树、四叉树和八叉树等索引结构,而在这些结构中 KD 树和八叉树在 3D点云数…