首页 > 其他分享 >普通的动态加载库 和 显式运行时链接

普通的动态加载库 和 显式运行时链接

时间:2024-03-25 14:57:25浏览次数:18  
标签:handle 函数 句柄 程序 显式 动态 链接 加载

  1. 静态库:

    • 静态库在编译时被链接到你的程序中,因此它们会成为你程序的一部分。
    • 这意味着当你运行你的程序时,静态库中的代码已经被包含在你的程序中,因此你的程序可以独立运行,不需要依赖外部库文件。
    • 静态库的一个缺点是,它会增加你程序的体积,因为静态库中的代码会被完整地复制到你的程序中。
  2. 动态库:

    • 动态库在运行时加载到内存中,因此它们不会被包含在你的程序中。
    • 当你运行程序时,操作系统会根据需要将动态库加载到内存中,并且多个程序可以共享同一个动态库的实例。
    • 这意味着如果多个程序都使用相同的动态库,它们可以节省内存,因为动态库只需要加载一次。
    • 动态库的一个缺点是,你的程序需要在运行时依赖这些库文件,如果动态库不存在或者无法加载,你的程序可能会崩溃或无法正常工作。

在 macOS 中,动态库的加载方式可以分为两种:

  • 动态加载:在程序运行时根据需要加载库。这种方式适用于需要根据程序运行时的条件来加载不同的库的情况,或者需要在程序运行时动态地加载插件的情况。
  • 普通加载:在程序启动时就加载库。这种方式适用于那些在整个程序生命周期中都需要使用的核心库或者常用库。
  • 在 macOS 中,动态加载库的接口主要涉及到使用动态链接库时的相关函数,这些函数通常包含在 <dlfcn.h> 头文件中。以下是一些常用的动态加载库的函数接口:

    1. dlopen()

      • 函数原型:void *dlopen(const char *path, int mode);
      • 功能:打开指定路径的动态库文件,并返回一个句柄(handle),该句柄可用于后续操作。
      • 参数:
        • path:动态库文件的路径。
        • mode:打开模式,通常为 RTLD_LAZY(懒加载,在需要时才加载)或 RTLD_NOW(立即加载)等。
    2. dlsym()

      • 函数原型:void *dlsym(void *handle, const char *symbol);
      • 功能:在已经打开的动态库中查找指定名称的符号(函数或变量),并返回其地址。
      • 参数:
        • handle:动态库句柄,由 dlopen() 返回。
        • symbol:要查找的符号的名称。
    3. dlclose()

      • 函数原型:int dlclose(void *handle);
      • 功能:关闭之前打开的动态库句柄,并释放相关资源。
      • 参数:
        • handle:要关闭的动态库句柄。
    4. dlerror()

      • 函数原型:char *dlerror(void);
      • 功能:返回上一个动态库操作的错误信息。如果操作成功,则返回 NULL。
      • 通常在 dlopen()dlsym()dlclose() 等函数调用失败后调用,以获取错误信息。

    这些函数可以让你在运行时动态地加载和使用动态库中的函数和变量,从而实现更灵活的程序设计。需要注意的是,使用动态加载库时,需要小心处理错误情况,避免因为加载失败或操作错误而导致程序崩溃或异常。

标签:handle,函数,句柄,程序,显式,动态,链接,加载
From: https://www.cnblogs.com/Galesaur-wcy/p/18094363

相关文章

  • Python数据匹配和记录链接库之recordlinkage使用详解
    概要Python的recordlinkage库为数据匹配和记录链接提供了一个强大的工具集,使得从不同数据源识别重复或相关记录变得简单高效。这对于数据清洗、合并数据集、实体识别等任务至关重要。recordlinkage库简介recordlinkage提供了一套全面的工具来进行复杂的记录比较、匹配和......
  • Oracle-12541无监听或者链接一直未响应
    近日Oracle服务器断电重启后服务挂了,现记录下主要的修复步骤1.检查磁盘空寂是否股够df-h2.服务挂载并启动服务器登录oracle帐号依次输入下列命令:sqlplus /assysdbashutdownimmedicatestartup3.服务启动测试退出linux终端,重新打开登陆sqlplus输入帐号/秘密:system......
  • Windows库链接报错
    问题回溯今天拿到别人已经编译好的库,发现在链接的时候出现了报错[9/912.7/sec]LinkingCXXsharedmodulebin\plugins\AsensingPlugin\AsensingPlugin.dllFAILED:bin/plugins/AsensingPlugin/AsensingPlugin.dllcmd.exe/C"cd.&&"C:\ProgramFiles\CMake\bin\cmake.e......
  • CentOS加载yum源时报错 [Errno 14] HTTP Error 404 - Not Found Trying other mirror.
    报错内容:[[email protected]]#yumrepolistLoadedplugins:fastestmirror,product-id,search-disabled-repos,subscription-managerThissystemisnotregisteredtoRedHatSubscriptionManagement.Youcanusesubscription-managertoregister.Determiningf......
  • Claude3发布成为大模型之王,Openai是否真的跌落神坛,附试用链接
    人不走空                                          ......
  • 项目第一个问题关于数据库链接
    项目安装SQLserver2022数据库,在安装完数据库后,使用官方数据库链接软件(SSMS)可以正常链接上数据库。但是使用visualstudio2019自带的数据库链接工具却链接不上在与SQLServer建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正......
  • AI金融预测领域综述文章筛选,附论文及代码链接,2021年版
    21年的综述最近读了3篇,总结笔记如下:(2021)SystematicLiteratureReview:StockPricePredictionUsingMachineLearningandDeepLearning评价:原文不值得看,精华是下面那4篇论文。但这篇综述的写法比较典型,都是先描述问题,搜解决策略(按关键字搜、按数据源搜比如某个领域的期刊),......
  • Java-Java基础学习(5)-注解和反射以及类的加载过程分析
    4.1注解的理解Annotation是从JDK5.0开始引入的新技术Annotation的作用不是程序本身,可以对程序作出解释(这点和注释comment没什么区别);可以被其他程序(比如:编译器等)读取;Annotation的格式注解是以“@注释名”在代码中存在的,还可以添加一些参数值,例如:@SuppressWarnings(v......
  • c++的链接器
    C++链接器是一个编译器工具,用于将编译器生成的目标文件(通常是对象文件)链接在一起,以生成可执行文件或共享库。在C++编程中,链接器负责解析函数和变量的引用,并将它们关联到正确的定义位置。链接器的主要任务包括:1.**符号解析**:解析目标文件中使用的函数和变量的符号引用。当编译器......
  • EndNote X9.3.3安装使用教程(附下载链接)
    EndNoteX9.3.3是一款非常nice的实用型文献管理软件,EndNoteX9功能极其强劲,便捷好用。安装教程解压后,会出现下面两个文件(其中一个是中文参考文献格式,另一个是安装文件)双击打开EndNotex9.3.3中科大英文版安装包,点击Next勾选Iacceptthelicenseagreement,点击N......