首页 > 其他分享 >静态库与共享库详解

静态库与共享库详解

时间:2024-08-16 11:26:20浏览次数:14  
标签:可执行文件 文件 gcc code 静态 详解 共享

静态库与共享库详解

在开发和使用 C 语言编写程序时,库文件(Library)是一个重要的组成部分。库文件是目标文件的集合,可以被其他代码调用。将代码封装编译成库文件有助于简化使用、便于管理,并提高安全性和保密性。本文将详细介绍静态库和共享库(动态库),并演示如何创建和使用它们。


一、静态库

静态库(Static Library)通常以 .a 结尾,是一组目标文件的集合。当我们调用静态库时,库中的二进制指令会被复制到可执行文件中。

  • 优点
    • 运行速度较快
    • 可执行文件在运行时不依赖静态库文件
  • 缺点
    • 可执行文件较大
    • 如果静态库修改后,需要重新编译可执行文件
1. 创建静态库
  1. 编译生成目标文件
    gcc -c code.c
    
  2. 打包目标文件生成静态库文件
    ar -r libname.a aa.o bb.o cc.o...
    
    • 注意:静态库文件名的前缀必须为 lib,后缀必须为 .a
2. 使用静态库
  1. 直接使用静态库
    gcc code.c libname.a
    
  2. 指定库文件的查找路径
    使用 -L 指定库的路径,使用 -l 指定库名(去掉前缀 lib 和后缀 .a)。
    gcc code.c -L /path -l name
    
  3. 通过环境变量指定库的默认查找路径
    1. 打开操作系统配置文件:
      vim ~/.bashrc
      
    2. 在文件末尾追加:
      export LIBRARY_PATH=$LIBRARY_PATH:/path
      
    3. 保存退出并重新加载配置文件:
      source ~/.bashrc
      
    4. 之后可以使用以下命令编译程序:
      gcc code.c -lname
      

二、共享库(动态库)

共享库(Shared Library,也称为动态库)通常以 .so 结尾。共享库类似于带入口的可执行文件,当程序运行时,共享库会被加载到内存中,并且可以通过函数名来访问共享库中的内容。

  • 优点
    • 可执行文件较小
    • 修改共享库后不需要重新编译可执行文件
  • 缺点
    • 运行速度比静态库慢
    • 可执行文件在运行时依赖共享库文件
1. 创建共享库
  1. 编译生成目标文件
    使用 -fpic 生成与位置无关的代码:
    gcc -fpic -c code.c
    
  2. 生成共享库
    使用 -shared 选项创建共享库:
    gcc -shared -fpic a.o b.o... -o libname.so
    
2. 使用共享库
  1. 编译时使用共享库
    1. 直接使用共享库编译
      gcc code.c libname.so
      
      需要注意的是,这种方式只能编译成功,运行时还需要确保共享库在系统的默认路径中。
    2. 指定库文件的查找路径
      gcc code.c -L /path -l name
      
    3. 通过环境变量指定库的默认查找路径
      1. 打开操作系统配置文件:
        vim ~/.bashrc
        
      2. 在文件末尾追加:
        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path
        
      3. 保存退出并重新加载配置文件:
        source ~/.bashrc
        
3. 运行可执行文件

运行可执行文件时,系统会从默认路径加载共享库。如果共享库不在默认路径中,需要通过设置 LD_LIBRARY_PATH 环境变量来指定共享库的加载路径。


三、注意事项
  1. 优先使用共享库:如果在同一目录下同时存在同名的共享库和静态库,编译器会优先使用共享库。
  2. 强制使用静态库:可以通过 -static 编译参数来强制使用静态库。

通过以上介绍,我们可以清楚地理解静态库和共享库的区别,以及如何在开发中灵活应用它们。根据项目需求选择合适的库类型,可以更好地优化程序的性能和管理方式。

标签:可执行文件,文件,gcc,code,静态,详解,共享
From: https://blog.csdn.net/m0_57538342/article/details/141255144

相关文章

  • SpringBoot整合日志功能(slf4j+logback)详解
     目录一、日志门面与日志实现1.1什么是日志门面和日志实现?1.2为什么需要日志门面?二、简介三、日志格式四、记录日志4.1使用日志工厂4.2 使用Lombok的@Slf4j注解五、日志级别5.1日志级别介绍5.2配置日志级别5.3指定某个包下的类使用某个级别5.4占位符打......
  • PCIe信号详解
    PCIe信号详解PCIe简介PCIe(peripheralcomponentinterconnectexpress)是一种高速串行计算机扩展总线标准,是用于连接高速组件的接口标准。每台台式电脑主板有许多PCIe插槽,可用于添加通用显卡,各种外设卡,无线网卡或固态硬盘等等,PC中可用的PCIe插槽类型将取决于你购买的主板。P......
  • Redis数据结构ZipList详解、ZipList的连锁更新问题
    ZipListZipList是一种特殊的“双端链表”,由一系列特殊编码的连续内存块组成。可以在任意一端进行压入/弹出操作,并且该操作的时间复杂度为O(1)。属性类型长度用途zlbytesuint32_t4字节记录整个压缩列表占用的内存字节数zltailuint32_t4字节记录压缩列表表尾节点距离压......
  • Redis数据结构:动态字符串SDS、Intset、Dict详解
    动态字符串:我们都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题:获取字符串长度的需要通过运算非二进制安全不可修改Redis构建了一种新的......
  • 详解Linux命令--ssh
    ssh命令是Linux中最常用的命令之一,用于通过安全的Shell协议远程登录和管理其他计算机。本文将详细介绍ssh命令的用法,并给出具体的示例。1.基本语法ssh的基本语法如下:ssh[options][user@]hostname[command][options]:可选参数,用于控制SSH会话行为。[user@]hostname:......
  • 详解Linux命令--目录
    Linux是一个功能强大的操作系统,适用于从个人计算机到超级计算机的多种平台。对于初学者来说,掌握基本的命令行操作是必不可少的技能之一。本文列举常用命令,并给出最最基础的使用示例,并附上详细介绍的连接。文件和目录管理1.cd(ChangeDirectory)用途:改变当前工作目录。......
  • 大模型的embedding详解
    **Embedding(嵌入)**是大语言模型和其他机器学习模型中的一种核心技术,它通过将离散的数据(如单词、句子、图像)转换为连续的向量表示,使得这些数据可以在高维空间中进行操作和分析。Embedding的本质是为模型提供一种能够捕捉数据之间语义或特征关系的紧凑数值表示。Embedding的基......
  • Spring Boot中的跨域资源共享(CORS)处理
    SpringBoot中的跨域资源共享(CORS)处理大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Web应用开发中,跨域资源共享(CORS)是一个常见的问题。当一个Web应用需要与另一个域下的Web服务进行交互时,浏览器出于安全考虑,会默认阻止这种跨域请求。SpringBoot......
  • 广度优先算法 BFS总结(算法详解+模板+例题)
    一.bfs是什么广度优先搜索(Breadth-FirstSearch,简称BFS),是一种图遍历算法。它从给定的起始节点开始,逐层地向外扩展,先访问起始节点的相邻节点,然后再访问相邻节点的相邻节点,以此类推,直到遍历完所有可达节点。二.基本思路1.一直往前走,直到到达终点。2.遇到分岔路口直接分出几条......
  • 函数(子程序)的常见、易混淆概念详解【对初学者有帮助】
    C语⾔中的函数也被称做子程序,意思就是⼀个完成某项特定的任务的⼀小段代码。C语⾔标准中提供了许多库函数,点击下面的链接可以查看c语言的库函数和头文件。C/C++官⽅的链接:https://zh.cppreference.com/w/c/header目录一、函数头与函数体二、实参与形参三、return的用法事......