windows vs 编译的动态库 能不能在linux 下调用

windows vs 编译的动态库 能不能在linux 下调用,第1张

这个理论上是可以实现的。但是很复杂,通用性不强。

1、windows上的动态库DLL文件是PE格式,而linux上的可执行文件是ELF格式,这两种格式首先不同。

2、但是,你可以在Linux上模拟实现一个PE加载器,然后加载DLL文件,实际上就是在Linux上实现一个PE Loader。 但是,这是一个相当复杂的事情,因为,微软没有公布PE的完全细节,我们现在所有了解的PE结构,那都是非官方公布的!

综上所述,不建议这样 *** 作,但是理论上能实现。

除了利用导出语句生成动态库之外,另外一种方式是采用模块定义(.def)文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。

此外,动态库的调用也分为静态加载和动态加载,动态加载是指在生成可执行文件时不将所有程序用到的函数链接到一个文件,因为有许多函数在 *** 作系统带的dll文件中,当程序运行时直接从 *** 作系统中找,前文已描述了使用导出语句生成动态库并做静态加载,此处使用模块定义文件生成动态库并采用动态加载的方式调用库。

动态库程序包含.lib文件和.dll文件,.lib文件是必需在编译期就连接到应用程序中的,dll文件是运行期才会被调用的,如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中,如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。

dll这个东西,只要放到编译时会去访问的任意路径上即可。

比如你现在是Debug,你可以放到Debug文件夹或者工程文件夹;

你现在是Release, 你可以放到Release文件夹或者工程文件放到System32无法访问可能说明你的程序根本不需要去访问System32,虽然这不太可能。

当然我可以认为楼主是在隐式调用dll, 显示调用失败系统不会报错。如果 你是要隐式调用已经知道库在何处和其中函数定义的dll,可以在你的FingerMatch.cpp开始的时候写上:

#ifdef _DEBUG

#pragma comment(lib, "..(路径)fp.lib")

#else

#pragma comment(lib, "..(路径)fp.lib")

#endif

然后包含一下fp.h,这个应该是已经做了。那应该不会有什么问题了。

值得注意的是编译时dll只会打开一次,比如你在Debug文件夹下有一个fp.dll,在工程文件夹下也有一个fp.dll,那么编译时使用的是Debug文件夹下的dll,因为它先被找到。

如果上面说的都没用,那么你显式调用吧


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8252107.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存