linux gcc 静态库的简单介绍

在 Linux 上,使用 GCC 编译器来创建和调用静态库时,涉及的实现原理和调用机制可以分为以下几个步骤:

1. 静态库的创建

静态库(通常以 .a 结尾)是由多个目标文件(.o 文件)打包在一起的归档文件。它们在编译期间被直接链接到应用程序中。

创建静态库的过程

  • 首先编译源文件,生成目标文件(

    .o
    

    文件)。

gcc -c foo.c -o foo.o
gcc -c bar.c -o bar.o
  • 然后使用

    ar
    

    (archive)命令将多个目标文件打包成静态库。

    Copy code
    ar rcs libmylib.a foo.o bar.o
    

这里的 ar 命令的参数:

  • r 表示插入文件或替换已存在的文件。
  • c 表示创建库文件。
  • s 表示创建库文件索引,以便在链接时快速查找函数。

2. 静态库的调用机制

当使用静态库时,库中的代码在编译时被复制到可执行文件中。这意味着:

  • 所有需要的函数和数据从静态库被直接嵌入到最终的可执行文件中。
  • 链接静态库后,生成的可执行文件不需要在运行时再依赖静态库。

链接静态库的过程

  • 编译并链接时,将静态库作为参数传递给 GCC。

    gcc main.c -L. -lmylib -o myapp
    

    这里的参数:

    • -L. 表示链接路径是当前目录。
    • -lmylib 表示链接名为 libmylib.a 的静态库(注意,lib 前缀和 .a 后缀可以省略)。

调用机制

  • 链接器会从静态库中提取所需的目标文件,并将其复制到生成的可执行文件中。
  • 因为所有必要的代码在编译时都被复制到可执行文件中,运行时不会再需要外部库文件。

3. 静态库的原理

  • 归档文件:静态库本质上是一个简单的归档文件,包含多个目标文件和一个索引。索引用于加速链接时对符号的查找。
  • 符号解析:在链接过程中,链接器会解析每个目标文件的符号(如函数和变量名),如果在目标文件中找不到定义,它会尝试在静态库中查找。如果找到匹配的定义,链接器会将静态库中的代码拷贝到可执行文件中。
  • 代码嵌入:静态库中的代码会被直接嵌入到生成的可执行文件中,因此静态库不需要像动态库那样在运行时被加载。结果是可执行文件会变得更大。

4. 优缺点

  • 优点

    • 运行时无需库文件:静态库的代码在编译时就已嵌入,因此在运行时不需要依赖外部库文件,分发程序时只需要分发一个可执行文件即可。
    • 性能:由于不涉及动态加载库,静态库的调用没有额外的运行时开销。
  • 缺点

    • 代码冗余:多个使用同一个静态库的程序会各自拥有该库的一份副本,导致二进制文件变大。
    • 更新不便:一旦静态库更新,所有使用它的程序都需要重新编译。

5. 示例

假设有如下 C 文件:

foo.c:

void foo() {printf("Hello from foo\n");
}

main.c:

#include <stdio.h>void foo(); // 函数声明int main() {foo();return 0;
}

创建静态库:

gcc -c foo.c -o foo.o
ar rcs libfoo.a foo.o

链接并编译:

gcc main.c -L. -lfoo -o myapp

运行程序:

./myapp

总结

静态库在编译时被直接链接到程序中,生成的可执行文件包含了库的所有代码。它的实现原理依赖于目标文件的归档和符号解析,调用机制通过在编译期间将库中的代码复制到最终的可执行文件中完成。

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

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

相关文章

判断线是否相交、判断点是否在线上、求线相交交点

先定义个点、线结构 typedef struct tagStruVertex {double x;double y;double distanceTo(const tagStruVertex& point) const{return sqrt((x - point.x) * (x - point.x) (y - point.y) * (y - point.y));}bool equal(const tagStruVertex& point) const{if (poin…

COMTRADE binary数据文件解析

一、COMTRADE 二进制文件的解析需要用到cfg文件中的配置信息&#xff0c;以及dat文件中的数据。 二、cfg文件 1、cfg文件整体配置 2、cfg文件实例 厂站名&#xff0c;记录装置&#xff0c;COMTRADE标准版本年号 SMARTSTATION,IED123,2013 总通道数&#xff0c;模拟通道编号&…

记录word转xml文件踩坑

word文件另存为xml文件后&#xff0c;xml文件乱码 解决方法&#xff1a; 1.用word打开.docx文件 2.另存为xml文件 3.点击工具 -> Web选项 -> 编码&#xff0c;选择UTF-8 4.点击确定 5.使用notpad打开xml文件 6.使用xml tool进行xml格式化即可。

uniapp小程序,使用腾讯地图获取定位

本篇文章分享一下在实际开发小程序时遇到的需要获取用户当前位置的问题&#xff0c;在小程序开发过程中经常使用到获取定位功能。uniapp官方也提供了相应的API供我们使用。 官网地址&#xff1a;uni.getLocation(OBJECT)) 官网获取位置的详细介绍这里就不再讲述了&#xff0c;大…

安宝特方案 | 医疗AR眼镜,重新定义远程会诊体验

【AR眼镜&#xff1a;重新定义远程会诊体验】 在快速发展的医疗领域&#xff0c;安宝特医疗AR眼镜以其尖端技术和创新功能&#xff0c;引领远程会诊的未来&#xff0c;致力于为为医生和患者带来更高效、精准和无缝的医疗体验。 探索安宝特医疗AR眼镜如何在医疗行业中引领新风潮…

视频推拉流/直播点播EasyDSS平台安装失败并报错“install mediaserver error”是什么原因?

TSINGSEE青犀视频推拉流/直播点播EasyDSS平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务&#xff0c;在应用场景中可实现视频直播、点播、转码、管理、录像、检索、时移回看等。此外&#xff0c;平台还支持用户自行上传视频文件&#xff0c;也可…

Gitbook 本地安装教程

Gitbook 本地安装教程 安装 node [nodejs的v10.21.0版本&#xff0c;下载地址&#xff1a;https://nodejs.org/dist/v10.21.0/node-v10.21.0-x64.msi] 其他版本有问题 npmnpm install -g gitbook-cligitbook init [初始化目录结构]gitbook build [编译]gitbook serve [运行] …

MongoDB日志级别

日志 查看当前的日志级别 根据你提供的 MongoDB 命令结果&#xff0c;命令 db.adminCommand({ getParameter: "logComponentVerbosity" }) 返回了 "ok" : 0&#xff0c;这意味着命令执行失败&#xff0c;没有成功获取到日志级别的配置信息。错误信息 &quo…

【项目一】基于pytest的自动化测试框架———解读requests模块

解读python的requests模块 什么是requests模块基础用法GET与POST的区别数据传递格式会话管理与持久性连接处理相应结果应对HTTPS证书验证错误处理与异常捕获 这篇blog主要聚焦如何使用 Python 中的 requests 模块来实现接口自动化测试。下面我介绍一下 requests 的常用方法、数…

【JAVA入门】Day45 - 压缩流 / 解压缩流

【JAVA入门】Day45 - 压缩流 / 解压缩流 文章目录 【JAVA入门】Day45 - 压缩流 / 解压缩流一、解压缩流二、压缩流 在文件传输过程中&#xff0c;文件体积比较大&#xff0c;传输较慢&#xff0c;因此我们发明了一种方法&#xff0c;把文件里的数据压缩到一种压缩文件中&#x…

[苍穹外卖]-10WebSocket入门与实战

WebSocket WebSocket是基于TCP的一种新的网络协议, 实现了浏览器与服务器的全双工通信, 即一次握手,建立持久连接,双向数据传输 区别 HTTP是短连接, WebSocket是长连接HTTP单向通信, 基于请求响应模型WebSocket支持双向通信 相同 HTTP和WebSocket底层都是TCP连接 应用场景…

JVM 调优篇7 调优案例1-堆空间的优化解决

一 jvm优化 1.1 优化实施步骤 1)减少使用全局变量和大对象&#xff1b; 2)调整新生代的大小到最合适&#xff1b; 3)设置老年代的大小为最合适&#xff1b; 4)选择合适的GC收集器&#xff1b; 1.2 关于GC优化原则 多数的Java应用不需要在服务器上进行GC优化&#xff1b…

Java中的Lambda表达式和Stream API详解

在现代Java开发中&#xff0c;Lambda表达式和Stream API是简化代码、提高可读性和开发效率的关键工具。Java 8引入的这两大功能不仅增强了语言的表达力&#xff0c;还大幅提升了处理集合和数据流的能力。本文将详细解析Lambda表达式和Stream API的使用方法&#xff0c;并结合实…

FreeRTOS常用API接口函数

提示&#xff1a;FreeRTOS常用API接口函数&#xff1a;并对部分参数附上自己的解释,后面继续补充 FreeRTOS常用API接口函数 1.任务相关的API1.1 创建任务&#xff1a;xTaskCreate1.2 开启任务调度器函数&#xff1a;vTaskStartScheduler1.3 任务的删除&#xff1a;vTaskDelete1…

Android Service服务使用方法

启动服务的方法 我们要隐式启动一个Service&#xff0c;首先我们需要配置AndroidMainfest.xml <service android:name".MyAsdlService"><intent-filter><action android:name"com.example.myasdlservice" /></intent-filter><…

Rollup 插件机制深入学习

插件系统的核心 Rollup 的插件系统是其强大功能的一部分&#xff0c;能够让开发者通过插件定制打包过程。插件的核心包括&#xff1a; Graph&#xff1a;Rollup 的全局图形表示&#xff0c;用于管理入口点及其依赖关系。PluginDriver&#xff1a;插件驱动器&#xff0c;负责调…

【ArcGISProSDK】初识

ArcGIS Pro SDK 提供四种主要的可扩展性模式&#xff1a;加载项、托管配置、插件数据源和 CoreHost 应用程序。 各模块文件对比 API 核心 核心程序集位于 {ArcGIS Pro 安装文件夹}\bin 中。 程序集描述ArcGIS.Core.dll 提供 CIM、地理数据库、几何图形和公共设施网络 API。 …

Prometheus+grafana监控spring boot 3运行情况

使用Prometheus和Grafana来监控Spring Boot 3应用的运行情况是一种强大的监控策略&#xff0c;可以帮助你了解应用的性能、健康状况以及潜在的问题。以下是如何配置这种监控系统的基本步骤&#xff1a; 1. Spring Boot 应用配置 首先&#xff0c;确保你的Spring Boot 3应用已…

Notepad++插件:TextFX 去除重复行

目录 一、下载插件 TextFX Characters 二、去重实操 2.1 选中需要去重的文本 2.2 操作插件 2.3 结果展示 2.3.1 点击 Sort lines case sensitive (at column) 2.3.2 点击 Sort lines case insensitive (at column) 一、下载插件 TextFX Characters 点【插件】-【插件管理…

从头开始学MyBatis—02基于xml和注解分别实现的增删改查

首先介绍此次使用的数据库结构&#xff0c;然后引出注意事项。 通过基于xml和基于注解的方式分别实现了增删改查&#xff0c;还有获取参数值、返回值的不同类型对比&#xff0c;帮助大家一次性掌握两种代码编写能力。 目录 数据库 数据库表 实体类 对应的实体类如下&#x…