动态链接库的链接和运行

news2024/11/25 2:48:59

        本文对动态链接库的链接和运行进行一个总结,为什么要分开说呢?因为链接通过生成可执行文件并不代表运行时能找到依赖的动态库。这与静态库是不一样的,因为静态库在编译完成后会库会编译到可执行程序中,但是动态链接库则不然,仅仅只是在可执行文件中打了一个标记,标识依赖哪个动态库文件。如何编译动态库或者如何编译静态库,这个很简单,在创建工程的时候进行就可以了,本文重点讲述动态库编译完成后如何链接到可执行程序中。下面将区分window平台和linux平台进行介绍。

        在编译阶段,如何保证编译可执行程序依赖动态链接库编译通过呢?需要在编译选项中添加-L选项指定依赖动态链接库的路径。

        这里要建立一个认识:如果一个可执行程序依赖另一个动态链接库,那么可执行程序能够正确的编译链接出来,并不代表该可执行之程序可以正常运行,因为在编译链接阶段能够成功仅仅代表可知形程序中依赖的动态链接库中的符号能够在动态链接库中找到,更直白一点的理解就是将可执行程序中的依赖的动态链接库的符号对应的位置打上动态链接库的标签,告知程序依赖哪个动态链接库。那为什么可执行程序可能不会正常运行呢?因为可执行程序仅仅在程序中标记了依赖哪个动态链接库,但是并未标明该动态链接库在哪里,所以运行的时候有可能找不到依赖的动态链接库,这就是可能运行出错的原因。解决问题的方法大致有两种

  • 在编译阶段通过添加编译选项指定动态链接库的位置,例如-Wl -rpath
  • 可执行程序搜索动态链接的路径会有几种默认的顺序,在任意一种方法中加入依赖的动态库均可。例如Linux系统下添加依赖库可以选择LD_LIBRARY_PATH环境变量来完成。

Windows VS Studio 2017

通过vs studio编译的动态库为dll后缀,在vs studio去哪里搜索依赖的动态库呢?下面给出几个路径:

  •  应用程序所在目录,即exe后缀的文件所在路径
  • 系统环境变量path,但是设置系统环境变量会影响所有的工程,还可能会造成符号冲突。
  • 设置工程环境变量,该环境变量仅应用于本工程,影响范围,是比较好的方法。设置方法如下图所示:

上面的总结是运行情况下的总结,那么编译过程中如果依赖dll文件,如何保证编译通过呢?

这个问题在gcc编译器下不存在问题,但是是用使用vs studio则不容易理解,因为生成一个dll会生成三个文件,test.lib test.dll test.h,为了编译通过需要在附近库目录中包含test.lib,在头文件中包含test.h应该就可以编过了。 

补充:

使用vs studio 2017测试,下面将测试过程列出:

  • 创建一个dll工程,需要注意的是一定在要在希望在别的工程调用的函数前面使用_declspec(export) ,只有使用这个符号才可以生成对应的dll和lib文件;如果不使用这个符号,那么将只会生成dll文件(这种情况下,动态链接库文件将无法被隐式加载,只能显式的调用加载dll接口加载),所以我们如果隐式的声明代码的话,一定要使用_declsepc(export)修饰。另外就是这个修饰符_declspec(export)只能放在源文件中修饰函数定义,用这个符号去修饰头文件中的函数声明是没有效果的。创建完成后输出对应的lib文件和dll文件。
//add.h
int add(int a,int b);
//add.cpp
_declspec(export) int add(int a, int b) 
{
    return a+b;
}
  • 创建一个win32控制台应用程序,在工程目录中创建一个目录,将上一个目录中生成中lib文加入到该目录,将依赖的头文件加入到工程中,通过属性->链接器->常规->附加库目录,添加lib文件所在目录。然后再次属性->链接器->常规->附加依赖项 添加依赖的lib名称(注意包含后缀),再次编译通过。
  • 直接运行第二步的程序,程序报错,提示缺少dll。如下所示:

 总结:上述测试说明了在window下依赖动态链接库的情况下的编译过程与dll无关,仅与lib和头文件有关

但是运行时需要将dll文件放到指定路径中才可以,因为实际运行时是实际加载对应的符号的,如果找不到该dll文件,则无法将生效

Linux gcc

 在gcc编译器编译过程中依赖的动态链接库文件,路径可以通过-L -l 设置依赖的动态库。

在运行过程中so搜索路径也有好几种:

  • 程序编译时用户指定的-Wl -rpath指定的搜索路径
  • 环境变量LD_LIBRARY_PATH指定的路径
  • /etc/ld.so.conf或/etc/ld.so.conf.d指定的路径
  • /lib路径或者/usr/lib路径

参考链接:动态库.lib与.dll关系、visual studio工程库路径配置浅析_动态库为什么会有lib和dll_Coding-Prince的博客-CSDN博客

vs 设置dll依赖库引用路径_vs2019设置dll路径_沐大人的博客-CSDN博客

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

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

相关文章

最新研究:可审计的具有拜占庭鲁棒的联邦学习方案

本人新论文,可免费下载:https://download.csdn.net/download/liangyihuai/87727720 Y. Liang, Y. Li and B. -S. Shin, “Auditable Federated Learning With Byzantine Robustness,” in IEEE Transactions on Computational Social Systems, doi: 10.…

【Unity3D日常开发】Unity3D中实现UI擦除效果、刮刮卡功能

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 使用Unity3D实现UI的擦拭效果、刮刮卡功能的效果实现方式比较多…

Python基于Pytorch Transformer实现对iris鸢尾花的分类预测,分别使用CPU和GPU训练

1、鸢尾花数据iris.csv iris数据集是机器学习中一个经典的数据集,由英国统计学家Ronald Fisher在1936年收集整理而成。该数据集包含了3种不同品种的鸢尾花(Iris Setosa,Iris Versicolour,Iris Virginica)各50个样本&am…

BatchNormalization和LayerNormalization的理解、适用范围、PyTorch代码示例

文章目录 为什么要NormalizationBatchNormLayerNormtorch代码示例 学习神经网络归一化时,文章形形色色,但没找到适合小白通俗易懂且全面的。学习过后,特此记录。 为什么要Normalization 当输入数据量级极大或极小时,为保证输出数…

【算法基础】直接插入排序 + 希尔排序

👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和算法 ✈️专栏:【C/C】算法 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你有…

基于人类反馈的强化学习(RLHF)在LLM领域是如何运作的?

基于人类反馈的强化学习在LLM领域是如何运作的? 为什么需要强化学习RLHFPre-training modelReward ModelFine-tune with RL 参考 为什么需要强化学习 指标无法衡量。在过去的nlp任务中,词性标注、机器翻译、语义判别等任务是nlp任务的主力军&#xff0c…

Hytrix原理

这里写目录标题 Hytrix容错机制熔断资源隔离线程池隔离信号量隔离 服务降级请求缓存请求合并 Hystrix流程图 Hytrix容错机制 熔断 在一个统计时间窗口(HYST rixCommandProperties.metricsRollingStatisticalWindowInMilliseconds())内,处理…

转化率双倍暴涨——客户自助服务门户

近年来,社交媒体的兴起使客户负责品牌对话。随着电子商务和在线帮助需求的扩大,公司必须满足并超越新的期望,以保持客户满意度。 通过SaleSmartly(ss客服)自动化流程功能建立客户自助服务是一种双赢的决策&#xff0c…

Ajax XHR响应

文章目录 AJAX 服务器 响应服务器响应responseText 属性responseXML 属性 AJAX 服务器 响应 服务器响应 如需获得来自服务器的响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。 属性描述responseText获得字符串形式的响应数据。responseXML…

2015年下半年软件设计师下午试题

试题一 【说明】 某慕课教育平台欲添加在线作业批改系统,以实现高效的作业提交与批改,并进行统计。学生和讲师的基本信息已经初始化为数据库中的学生表和讲师表。系统的主要功能如下: 提交作业。验证学生标识后,学生将电子作业通…

Ajax 数据库

文章目录 AJAX Database 实例AJAX 数据库实例实例解释 showCustomer() 函数AJAX 服务器页面 AJAX Database 实例 AJAX 可用来与数据库进行动态通信。 AJAX 数据库实例 下面的例子将演示网页如何通过 AJAX 从数据库读取信息: 请在下面的下拉列表中选择一个客户&…

【wpf】转换器 Converter

今天积攒了一个转换器的用法,分享给各位。 我们经常会有这种需求: 某些控件有时需要显示,有时需要隐藏,比如: 那,我就想通过一个bool变量和是否显示绑定。 但是我们知道,是否显示,…

nssctf web

[BJDCTF 2020]easy_md5 测试发现输入的内容会通过get传递但是没有其他内容 观察一下响应头 我们看到了 select * from admin where passwordmd5($pass,true) 这里的md5(string,raw) 这里的string应该清楚就是字符串,是必选参数 raw是可选参数 默认不写为FA…

08 - Linux终端与进程

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接:(更新中)Linux系统编程训练营 - 目录 文章目录 1. 详解控制台与终端1.1 问题1.2 历史回顾1.2.1 控制台(Console)1.2.2 终端(Terminal) 1.3 历史发展进程1.4 终端与…

【Springboot系列】项目启动时怎么给mongo表加自动过期索引

1、前言 在之前操作mongo的过程中,都是自动创建,几乎没有手动创建过表。 这次开发中有张表数据量大,并且不是特别重要,数据表维护一个常见的问题是过期数据没有被及时清理,导致数据量过大,查询变得缓慢。…

【操作系统】CPU 缓存一致性、MESI 协议

【操作系统】CPU 缓存一致性、MESI 协议 参考资料: CPU缓存一致性协议(MESI) 【JUC】Java并发机制的底层实现原理 CPU 缓存一致性 文章目录 【操作系统】CPU 缓存一致性、MESI 协议CPU Cache 的数据写入写直达写回 缓存一致性问题总线嗅探MESI 协议总结 CPU Cache …

电感知识大全

目录 一、电感的种类 1、共模电感 2、差模电感 3、工字电感 功率电感 4、磁珠 5、变压器 6、R棒电感、棒形电感、差模电感 二、电感符号 三、电感特性 前面在学习电容的时候,为了让大家更形象,更通俗的去理解这个元器件,都是拿水缸去…

IO多路复用——select函数

1.select函数原型和fd_set结构体说明 1.1 select函数原型 ​ 使用 select 这种 IO 多路转接方式需要调用一个同名函数 select,这个函数是跨平台的,Linux、Mac、Windows 都是支持的。程序员通过调用这个函数可以委托内核帮助我们检测若干个文件描述符的…

mybatisPlus·入门·贰

文章目录 1 简单CRUD接口1.1 根据id查询({id传参)1.1.1 接口类直接继承IService1.1.2 controller直接调用方法 1.2 根据ids查询1.3 新增1.3.1 接口类直接继承IService1.3.2 controller直接调用方法 1.4 修改状态(Query传参)1.4.1 …

GPT-4 IDEA神仙插件亲测帮助亿万用户解决痛点!

最近,Intellij IDEA的插件商店推出了一款新的插件——Bito,据说使用了GPT-4和ChatGPT来帮助开发人员编写代码,并且下载量已经达到了65K以上。 这款插件可以将GPT-4和ChatGPT引入IDE来大大提高开发人员的效率。它使用了OpenAI的模型&#xff0…