【Linux基础】库文件

这篇具有很好参考价值的文章主要介绍了【Linux基础】库文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • (꒪ꇴ꒪ ),hello我是祐言
  • 博客主页:C语言基础,Linux基础,软件配置领域博主🌍
  • 快上🚘,一起学习!
  • 送给读者的一句鸡汤🤔:
  • 集中起来的意志可以击穿顽石!
  • 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏

​​

概念

        在Linux系统中,库文件(Library files)是一种可重用的代码和函数集合,用于在编程过程中提供共享的功能和资源。库文件的扩展名通常为 .a静态库)或 .so动态库),具体取决于库的类型。

库文件的分类

     库文件分为两种类型:

  1. 静态库(Static Library):

    • 静态库是在编译时链接到可执行文件的库文件。
    • 静态库的代码和数据被复制到可执行文件中,使得可执行文件在运行时不依赖于外部库文件。
    • 静态库的文件扩展名通常为 .a
    • 使用静态库可以使得程序在不同系统上具备独立性,但会增加可执行文件的大小。
  2. 动态库(Dynamic Library):

    • 动态库是在运行时链接到可执行文件的库文件。
    • 动态库的代码和数据保留在库文件中,多个可执行文件可以共享同一个动态库文件。
    • 动态库的文件扩展名通常为 .so(共享对象)。
    • 动态库的使用可以减小可执行文件的大小,但在运行时需要依赖相应的动态库文件。

使用库文件的优点

        使用库文件的优点包括代码重用、减小可执行文件的大小、简化代码维护等。常见的库文件类型包括标准C库(libc)、数学库(libm)、图形库(libX11)、网络库(libcurl)等。在Linux系统中,库文件通常存放在标准目录(如/usr/lib/usr/local/lib)或特定程序的安装目录中。

编译生成动态库

     要生成动态库,可以使用以下编译选项:

  1. -shared:指定生成动态库。
  2. -fPIC:指定生成位置无关代码。位置无关代码是一种机器代码,可以在内存中的任何位置执行,适用于动态链接库。

        示例:

gcc -fPIC -shared -o libexample.so source_file1.c source_file2.c

编译生成静态库

  1. -c:只进行编译,生成目标文件(.o文件)而不进行链接。

    示例:
    gcc -c source_file1.c source_file2.c
  2. ar命令:用于创建和管理静态库。

    • ar命令用于创建、更新和查看静态库,将多个目标文件打包成一个库文件。
    • 示例1(创建库):
      ar rcs libexample.a file1.o file2.o
    • 示例2(向现有库中添加目标文件):
      ar r libexample.a new_file.o

库的使用与链接

     要在程序中使用库文件,需要进行以下步骤:

  1. 头文件包含:

    • 如果要使用库中的函数、数据结构或常量,需要在代码中包含相应的头文件。
    • 通常使用#include指令将库的头文件包含到源代码中。
    • 示例:
      #include <library.h>
  2. 编译阶段的库链接:

    • 在编译可执行文件或目标文件时,需要指定所使用的库文件和链接选项。
    • 对于静态库,使用-l选项指定库文件的名称(不包括前缀lib后缀)。
    • 对于动态库,可以使用-l选项指定库文件的名称,同时使用-L选项指定库文件的搜索路径。
    • 示例:
      gcc -o executable_name main.c -L/path/to/lib -lmylib

动态库运行时链接

        动态库的运行时链接需要特殊处理,以便系统可以在运行时加载并链接动态库。以下是几种常用的方法:

  1. 编辑/etc/ld.so.conf文件:

    • 在Linux系统中,可以编辑/etc/ld.so.conf文件,添加库文件所在的路径。
    • 然后使用  sudo ldconfig命令更新动态库缓存。
    • 这样,系统会在运行时自动搜索并加载库文件。
  2. 使用LD_LIBRARY_PATH环境变量:

    • 设置LD_LIBRARY_PATH环境变量,指定动态库文件的搜索路径。
    • 在终端中执行以下命令(将/path/to/lib替换为实际的库文件路径):
      export LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH
      
  3. 使用rpath选项:

    • 在编译可执行文件时,可以使用-Wl,-rpath,<library_path>选项指定运行时库的路径。
    • 这样编译生成的可执行文件会包含rpath信息,告诉系统运行时在指定的路径中查找库文件。
    • 示例:
      gcc -o executable_name main.c -Wl,-rpath,/path/to/lib -lmylib
  4. 使用LD_PRELOAD环境变量:

    • 设置LD_PRELOAD环境变量,指定要在程序加载时预加载的动态库。
    • 这样指定的库会在其他库之前加载,可以用于替换或增强标准库函数的行为。
    • 在终端中执行以下命令(将/path/to/library.so替换为实际的库文件路径):
      export LD_PRELOAD=/path/to/library.so
      

        动态库运行时链接的好处是可以将程序与库文件分离,使程序更加灵活和可移植。程序可以在运行时动态加载所需的库文件,而不需要将所有的库文件都静态链接到可执行文件中。这样可以减小可执行文件的大小,并且在库文件更新或升级时无需重新编译整个程序。

动态库插件

        动态库插件(Dynamic Library Plugins)是一种在运行时动态加载和卸载的动态库,用于扩展应用程序的功能。插件机制使应用程序能够在不重新编译或重新启动的情况下加载和卸载特定功能的动态库。

      以下是动态库插件的一般使用流程:

  1. 插件接口定义:

    • 定义插件的接口,包括函数、数据结构或其他需要在插件中使用的元素。
    • 这个接口定义通常以头文件的形式提供,供插件和主应用程序共享。
  2. 插件编写:

    • 创建插件源代码文件,并实现插件接口中定义的函数和功能。
    • 编写插件的编译脚本或Makefile,用于将插件源代码编译为动态库文件(.so文件)。
  3. 插件加载:

    • 在主应用程序中,使用操作系统提供的动态库加载机制(如dlopen()函数)加载插件动态库。
    • 加载插件后,可以使用插件中定义的函数和功能。
  4. 插件使用:

    • 在主应用程序中,通过插件提供的接口函数调用插件的功能。
    • 这些函数通过函数指针获取并调用插件中对应的函数。
  5. 插件卸载:

    • 当插件不再需要时,使用操作系统提供的动态库卸载机制(如dlclose()函数)卸载插件动态库。
    • 卸载插件后,插件的功能将不再可用。

        动态库插件机制可以使应用程序更加灵活和可扩展,允许通过插件的方式添加、删除或更新功能模块,而无需重新编译整个应用程序。这种模块化的设计使应用程序更易于维护和扩展。

动态库接口使用

     使用动态库的接口主要涉及以下几个方面:

  1. 头文件引入:

    • 在源代码中,需要包含动态库的头文件以访问库中的函数、数据结构和常量。
    • 使用#include指令将库的头文件包含到源代码中。
    • 示例:
      #include <library.h>
  2. 动态库加载:

    • 在运行时,需要加载动态库以获得库中定义的函数和符号。
    • 使用操作系统提供的加载动态库的API,如dlopen()函数(一般在Linux中)。
    • 示例:
      void* libraryHandle = dlopen("libexample.so", RTLD_LAZY);
      if (libraryHandle) {
          // 动态库加载成功,可以进行函数调用
          // 通过dlsym()函数获取函数指针,并进行函数调用
          void (*libraryFunction)() = dlsym(libraryHandle, "libraryFunction");
          if (libraryFunction) {
              libraryFunction();
          }
          dlclose(libraryHandle); // 关闭动态库句柄
      } else {
          // 动态库加载失败,处理错误
      }
      
  3. 函数调用:

    • 在加载动态库后,可以通过获取函数指针的方式调用动态库中的函数。
    • 使用函数指针调用函数,类似于直接调用静态库或静态链接的函数。
    • 示例:
       
      void (*libraryFunction)() = dlsym(libraryHandle, "libraryFunction");
      if (libraryFunction) {
          libraryFunction();
      }
      
  4. 动态库卸载:

    • 在使用完动态库后,需要显式地卸载动态库并释放相关资源。
    • 使用操作系统提供的卸载动态库的API,如dlclose()函数(一般在Linux中)。
    • 示例:
      dlclose(libraryHandle);

        需要注意的是,动态库的使用和接口调用可能涉及到库的初始化、资源管理、错误处理等方面的考虑。具体实现和使用方式可能因库的设计和要求而有所不同,建议参考库的文档和使用说明以获取准确的接口使用方式和最佳实践。

    文章来源地址https://www.toymoban.com/news/detail-576585.html

📢写在最后

  • 今天的分享就到这啦~
  • 觉得博主写的还不错的烦劳 一键三连喔~
  • 🎉感谢关注🎉

到了这里,关于【Linux基础】库文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C标准库文件&常用函数

    编号 头文件 C标准版本 介绍 1 assert.h C89/C90 条件编译宏,将参数与零比较 2 ctype.h C89/C90 用来确定包含于字符数据中的类型的函数 3 errno.h C89/C90 报告错误条件的宏 4 float.h C89/C90 浮点数类型的极限 5 limits.h C89/C90 基本类型的大小 6 locale.h C89/C90 本地化工具 7 math.h C89/C90 常用数据函

    2024年02月12日
    浏览(35)
  • C++有哪些常用的库文件

    常用库文件: iostream:  输入输出流库,包含cin、cout、cerr等标准输入输出对象。 string : 字符串库,包含字符串类型std::string及相关操作函数。 vector : 动态数组库,包含vector类型及相关操作函数。 map:  字典库,包含map、multimap、set、multiset等关联容器类型及相关操作函数。 algorithm

    2024年02月02日
    浏览(35)
  • 第十二部分 使用 make 更新函数库文件

    目录 前言  一、函数库文件的成员 二、函数库成员的隐含规则 三、函数库文件的后缀规则 四、注意事项         函数库文件也就是对 Object 文件(程序编译的中间文件)的打包文件。在 Unix 下,一 般是由命令\\\"ar\\\"来完成打包工作。         一个函数库文件由多个文件

    2024年01月20日
    浏览(38)
  • 通过 CMake 制作库文件 静态库 和 动态库

    CMake Calc 项目 在这里有 add.c,div.c,mult.c,sub.c,main.c,head.h 二、生成静态库  CMakeLists.txt  CMakeLists.txt   (也可以写成这样) 执行命令:  三、生成动态库 CMakeLists.txt    CMakeLists.txt   (也可以写成这样) 

    2024年01月16日
    浏览(43)
  • openssl缺少libssl.so.1.1库文件

    这是由于openssl库的位置不正确造成的,一般出现在openssl源码升级场景下。 源码编译完成后,需要对libssl.so.1.1做一个软连接,从openssl源码安装目录/usr/local/openssl/lib/下面将编译好的libssl.so.1.1进行软连接。

    2024年01月21日
    浏览(38)
  • 现代CMake高级教程 - 第 3 章:链接库文件

    双笙子佯谬老师的【公开课】现代CMake高级教程课程笔记 main.cpp 调用 mylib.cpp 里的 say_hello 函数 1. 直接链接到一起编译 2. mylib 作为一个静态库 编译: 生成了 libmylib.a: 3. mylib 作为一个动态库 编译: 4. mylib 作为一个对象库 对象库类似于静态库,但不生成 .a 文件,只由 CMake

    2024年02月02日
    浏览(32)
  • makefile 编译动态链接库使用(.so库文件)

    动态链接库:不会把代码编译到二进制文件中,而是在运行时才去加载, 好处是程序可以和库文件分离,可以分别发版,然后库文件可以被多处共享 动态链接库 动态:动态加载 链接:二进制文件和库文件分离。 库 库文件 .so 新建一个文件TestSo 编译一下 main.cpp 写好之后我们

    2024年01月23日
    浏览(32)
  • 【cmake学习】cmake 引入第三方库(头文件目录、库目录、库文件)

    程序的编写需要用到头文件,程序的编译需要lib文件,程序的运行需要dll文件,因此cmake引入第三方库其实就是将include目录、lib目录、bin目录引入工程。         目录 1、find_package(批量引入库文件和头文件) 2、include_directories(引入头文件目录) 3、link_directories(引入库

    2024年02月09日
    浏览(37)
  • Python3: 扫描库文件并获取版本号信息

    在 C/C++ 开发中使用了第三方库,具体说是 .a , .lib , .dll 等文件,想通过 Python 查询出这些文件中的版本号信息。 有人可能好奇,这里简单消除可能得疑虑: 为什么不用源代码,而用库? 因为库文件提供了良好的 隔离性 ,避免了繁杂的编译选项指定, 避免了潜在的不小心改

    2024年02月05日
    浏览(72)
  • java.lang.Exception: 密钥库文件不存在: keystore

    java.lang.Exception: 密钥库文件不存在: keystore 笔者使用第三方服务,需要提供发布版安全码SHA1, 控制台直接输入 报错 具体报错信息如下: 步骤1、控制台终端输入 步骤2、输入密钥口令 默认为android 当然,您可以更改。您所更改的密码要求不得少于六位数字,且需要确认。 步

    2024年04月09日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包