【LInux编译器gcc/g++】gcc使用方法和动静态库相关概念

news2024/12/26 22:52:24

目录

一.前言

二.源代码的翻译环境

三.gcc相关指令

四.动静态库

1.什么是库?

2.库的命名

3.库的链接方式

4.动静态链接的优缺点

5.小结


一.前言

在Windows系统上我们常用VisualStudio来进行C/C++开发,VS并不是一款单一的软件,而是集成开发环境(IDE),其中包含编辑器,编译器,调试器等等,功能很强大。而在LInux当中,我们需要学会使用各项独立的工具才能进行开发,例如用vim编辑代码,用gcc编译代码,用gdb调试代码。

今天我们就来讲讲如何使用gcc来得到我们需要的可执行程序,并介绍编译过程中的动静态库问题。

二.源代码的翻译环境

我们编写的C语言是自然语言,它是供我们人类阅读的,计算机并不懂。所以需要将它翻译成计算机看得懂的二进制语言,而这个翻译过程,就是经常说的编译。

实际上一个或多个源文件变层可执行程序需要经历编译和链接两个阶段,但我们日常所说的编译是把链接阶段也包含在内的,下面我也不再刻意区分这两个阶段。

程序编译的过程包含以下四个阶段

  1. 预处理
  2. 编译
  3. 汇编
  4. 链接

而gcc编译器就是来完成这四项工作的

【注:想要进一步理解程序的翻译过程可参考我以前写的程序的编译(翻译)】

三.gcc相关指令

gcc -E code.c -o code.i

-E表示从现在开始进行程序翻译,等预处理完成就停下来,不要继续往后走了。

-o表示把生成的文件重命名

预处理阶段做了四件事:

  1. 头文件展开
  2. 条件编译
  3. 去注释
  4. 宏替换

得到的code.i文件依然是C语言代码

gcc -S code.i -o code.s

-S表示从现在开始进行程序翻译,等编译完成就停下来,不要继续往后走了。

这里的code.i是否可以换成code.c呢?肯定是可以的,但是没必要,因为这样之前的工作又会被重复做一遍。

这时的code.s文件就是汇编代码了

gcc -c code.s -o code.o

-S表示从现在开始进行程序翻译,等汇编完成就停下来,不要继续往后走了。

完成汇编后,code.o就是一个二进制文件了,但现在它并不能执行,因为还差最后一个链接阶段

gcc code.o mybin

链接并不像前几个阶段一样有专门的选项,因为链接就是翻译的最后一步,通常情况下我们都是直接执行以下指令一步到位,并不会傻傻地把这四个步骤分开做

gcc code.c -o mybin  

细节问题 :

我们在test.c文件中写了这样一段代码

 编译时发现不能通过

这是因为在for循环里定义临时变量c99标准里才支持的,我现在的这款gcc编译器默认是不支持的,要想采用c99标准编译代码,只需在后面加上std=c99即可

gcc  -std=c99  test.c  -o  test.out

四.动静态库

简而言之:.o文件+库=可执行程序

故链接阶段就是将.o文件(可重定位的二进制文件)和库链接起来

那么接下来就有两个问题:什么是库呢?如何链接.o文件和库的呢?

1.什么是库?

下面介绍一个指令

ldd mybin

ldd是用来查看一个可执行程序依赖的第三方库

 

可以看出来mybin依赖三个库,其它两个不管,我们把中间的那个拎出来 

 

我们在LInux系统中找一下,看是否有这个文件

果然有这个文件,而且给普通用户开放的权限还挺高,可读可写可执行。

注意库并不是头文件,预处理阶段include过来的并不是它哟,头文件这个路径下?

 

 头文件放的是函数的声明,库提供方法实现。

头文件+库+我们写的代码=我们的可执行程序

“LInux下一切皆文件“,所以库其实也就是个文件。系统中的头文件和库文件都是文件!所以,所谓的开发环境安装,一定要做什么工作?

安装下载并拷贝头文件和库文件到开发环境中的特定路径下,一定要能被编译器自己找到

在下载VS时,会让你选择安装C++桌面版,游戏开发等环境,说白了就是不同的头文件和库文件嘛

2.库的命名

以libc.so.6这个库为例

库要求以lib开头,so表示这个库是静态库,6是版本号,所以一个库的名字要去掉前缀和后缀,所以这个库的名字就是c,也就是传说中的C标准库。

库分为两类:动态库和静态库,在LInux当中,so表示动态库,a表示静态库。在常规的开发环境中,动态库居多

3.库的链接方式

动态库:是C/C++或其它第三方提供的所有方法的集合,被所有程序以链接的方式关联起来,这种链接方式叫做动态链接

静态库:是C/C++或其它第三方提供的所有方法的集合,被所有程序以拷贝的方式,将需要的代码,拷贝到自己的可执行程序中,这种链接方式叫做静态链接 

库中所有的函数,都有入口地址,所谓的动态链接,其实就是把链接的库中的函数地址拷贝到我们的可执行程序中的特定位置。

4.动静态链接的优缺点

动态链接:优点:形成的可执行程序体积比较小,比较节省资源。

                  缺点:强依赖动态库,动态库没了,所有依赖这个库的程序都无法运行了

静态链接:优点:无视库,可以独立运行

                  缺点:体积太大,浪费资源

LInux系统中的指令,实际上就是一个个可执行程序 

 既然是可执行程序,那我们就能查看它所依赖的库

可以看到,pwd指令也是用C语言写的,它也依赖C标准库。实际上,LInux中的绝大多数指令都是用C/C++写的,如果我们将C标准库删掉,那么这个系统基本也就挂了,因为最基本的指令都无法运行,更别说其它操作了。

接下来我们想看看动静态链接的可执行程序的大小差异,如何做呢?

gcc默认是采用动态链接的方式,去找对应的动态库,所以采用如下指令即可

 

要想静态链接,只需在后面跟上一个-static

但有可能会报出这样的一个错误

这是因为我们的系统里默认是没有安装 C静态库的。我们可以手动安装一下C/C++静态库

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

 最终两个可执行程序都生成了,可以看到它们的体积大小相差了将近100倍,这还是我仅仅在里面写了一个helloworld的情况下。

所以这也能解释为什么编译器默认采用的是动态链接,因为静态链接太浪费空间了。这里的空间不仅仅指磁盘上的空间,还包括内存。你要知道,一个可执行程序要想执行,首先必须是要加载到内存中去的呀,所以使用动态链接加载到内存会更快

5.小结

我们的开发环境,编译器都要为我们做什么?

  1. 下载开发环境(头文件和库文件)
  2. 设置合理的查找路径
  3. 设定好我们形成可执行程序的链接方式

所以编译时出现链接问题,要么是库文件损毁了,要么是路径没或者链接方式没有设定好。

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

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

相关文章

UI设计模式是什么?有哪些常用的?

UI设计模式是针对常见的用户界面问题提出的解决方案。当解决方案得到验证时,它经常被使用,最终演变成可重复使用的设计模式。 设计师可以根据不同的网站功能类型选择使用相应的网站UI设计模式,从而创建一致高效的网站UI界面。 本文推荐8种常…

选择排序——直接选择排序

直接选择排序:(以重复选择的思想为基础进行排序) 1、简述 顾名思义就是选出一个数,再去抉择放哪里去。 设记录R1,R2…,Rn,对i1,2,…,n-1,重复下…

【MMDetection】bug记录

bug1: if env_cfg.get(cudnn_benchmark): AttributeError: NoneType object has no attribute get 解决办法: 配置文件缺少了env_cfg信息,需要在config文件中添加,如以下内容: env_cfg dict(cudnn_benchmarkFalse…

Java 使用 EMQX 实现物联网 MQTT 通信

一、介绍 1、MQTT MQTT(Message Queuing Telemetry Transport, 消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于&#xff…

Netty核心原理:一、基础入门-01:初入JavaIO之门BIO、NIO、AIO实战练习

文章目录 一、前言介绍1.1 BIO:同步阻塞I/O模式1.2 NIO:同步非阻塞I/O模式1.3 AIO:异步非阻塞I/O模式 二、代码实现2.1 工程结构2.2 BIO:同步阻塞I/O实现2.2.1 BIO处理器2.2.2 BIO适配器2.2.3 BIO客户端处理器2.2.4 BIO客户端2.2.…

计算机网络第五章——传输层(上)

早知如此绊人心,何如当初莫相识 文章目录 前言 前言 虽然说是手机和手机之间的通信但是其实是手机之间的进程和进程之间的通信,所以这一章主要是研究进程之间通信的问题,在计算机网络中有一个重要的问题,在进行数据通信和资源共享…

【分享】golang windows 运行报错 undefined: syscall.SIGUSR1

在跟着煎鱼大佬学习 Golang-gin的时候,"在优雅的重启服务篇" ,为了gin服务的热更新,采用了 endlessfresh的方案,安装endless后无法在windows本地调试,然后报错。 (优雅的重启服务-地鼠文档优雅的重启服务-我不怎么喜欢左写写&#…

linux内核模块编译方法之模块编程详解

文章目录 一、模块传参二、模块依赖三、内核空间和用户空间四、执行流五、模块编程与应用编程的比较六、内核接口头文件查询总结 本期和大家主要分享的是驱动开发内核编译过程中对于模块是如何设计的,进行了详细的分享,从模块传参、模块依赖一直到内核空…

楼顶空地适合建造气膜体育馆吗?

众所周知,传统建筑的荷载太大,出于安全考虑,是不适合继续在楼顶加盖传统结构体育馆的,但是,气膜体育馆作为一种装配式建筑,它是可以在城市高空上建造一个轻盈又新颖独特的全天候气膜馆。 气膜体育馆作为一种…

小黑自己在家尝试涮牛排,肚子又开始了新一轮的胀气,喝到了酱香拿铁并烫了纹理发型体验一把的leetcode之旅:123. 买卖股票的最佳时机 III

动态规划1 class Solution:def maxProfit(self, prices: List[int]) -> int:# 数组长度n len(prices)if n < 2:return 0# 动态规划变量# 第一次买的价格first_price prices[0]# 第一次卖的收益first_cell 0# 第二次买的价格second_price prices[0]# 第二次卖second_…

STM32H750 HAL CUBEMX 时钟失败及死机无法下载问题解决

芯片采样电压设置&#xff0c;否则 无法运行 解决死机问题 设置swd 模式 短接 boot0 —vcc 3.3v即可正常下载

驱动开发,stm32mp157a开发板的led灯控制实验

1.实验目的 编写LED灯的驱动&#xff0c;在应用程序中编写控制LED灯亮灭的代码逻辑实现LED灯功能的控制&#xff1b; 2.LED灯相关寄存器分析 LED1->PE10 LED1亮灭&#xff1a; RCC寄存器[4]->1 0X50000A28 GPIOE_MODER[21:20]->01 (输出) 0X50006000 GPIOE_ODR[10]-&g…

5. HBase必知必会之理论进阶篇

HBase必知必会之理论进阶篇 1.1 集群搭建以及规模预测1.1.1 HBase集群搭建1.1.2 HBase集群规划 1.2 HBase重要的概念1.2.1 snapshot1.2.2 region 切分1.2.3 RIT1.2.4 HBase读优化1.2.4.1 客户端优化1.2.4.2 服务端优化1.2.4.3 hdfs 优化 1.2.5 HBase写优化1.2.5.1 客户端优化1.…

Linux centos7 bash编程训练__打印各类形状

利用for循环&#xff0c;打印各种不同的三角形、矩形和菱形。 主要是fort循环嵌套使用&#xff0c;及条件判断等。 因方法简单&#xff0c;不作更多解释&#xff0c;部分注释可以帮助初学者掌握代码。 下面列出代码&#xff0c;供参考。 #! /bin/bash ## 打印输出各种*型形…

中企出海,用火山引擎DataTester开启增长第一步

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 今年 Google 宣布其提供的A/B测试工具 Optimize 将在2023年9月30号停止服务。在全球化浪潮席卷下&#xff0c;越来越多的中国企业正在加速走向全球市场&#xff0c;…

使用 Webpack 从 0 到 1 构建 Vue3 项目 + ts

使用 Webpack 从 0 到 1 构建 Vue3 项目 1.初始化项目结构2.安装 webpack&#xff0c;补充智能提示3.初步编写 webpack.config.js3.1设置入口文件及出口文件3.2 指定 html 模板位置 4.配置 运行/打包 命令&#xff0c;首次打包项目5.添加 Vue 及相关配置5.1安装并引入 vue5.2 补…

一个详细且完整的公司局域网搭建案例,跟着操作!

局域网(Local Area Network&#xff0c;简称LAN)&#xff0c;用于将有限范围内&#xff08;例如一个实验室、一层办公楼或者校园&#xff09;的各种计算机、终端与外部设备互联成网。公司局域网怎么建立&#xff1f;首先来了解下不同规模企业网络组建方式。 10人以下企业网络组…

固定资产管理表怎么填写

在现代企业管理中&#xff0c;固定资产的管理是至关重要的环节。它不仅关系到企业运营的效率&#xff0c;也直接影响到企业的财务状况。因此&#xff0c;正确、有效地填写和管理固定资产管理表显得尤为重要。并提供一些创新的方法来优化这一过程。  让我们理解什么是固定资产…

Win10 cmd默认使用管理员身份运行的修改

一、在开始菜单搜索cmd&#xff0c;打开快捷方式文件位置 二、鼠标右键快捷方式&#xff0c;打开属性 三、选择高级&#xff0c;再勾选用管理员身份运行&#xff0c;点击确定即可

文心一言插件开发全流程,ERNIE-Bot-SDK可以调用文心一言的能力

文心一言插件开发 前言插件插件是什么工作原理申请开发权限 开始第一步&#xff1a;安装python第二步&#xff1a;搭建项目manifest 描述文件&#xff1a;ai-plugin.json插件服务描述文件&#xff1a;openapi.yaml开发自己的plugin-server 第三步&#xff1a;上传插件 SDK相关链…