首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定是否存在动态库的多平台方法

确定是否存在动态库的多平台方法
EN

Stack Overflow用户
提问于 2013-04-10 20:06:45
回答 2查看 3.7K关注 0票数 5

我需要检查是否存在动态库,以便以后可以安全地调用使用该库的函数。

有没有一种多平台的方法来检查这个?我的目标是MS Windows7 (VC++11)和Linux (g++)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-10 20:17:22

要动态“使用”共享库中的函数,需要该库不是可执行文件的一部分,因此您需要编写代码来加载库,然后使用该函数。很可能有办法以可移植的方式做到这一点,但我不知道有任何代码可以做到这一点。

这并不是很难写的代码。作为“步骤”,它涉及到以下内容:

  1. 在给定文件名的情况下加载库(例如"xx",然后在特定于体系结构的代码中将其转换为"xx.so“或"xx.dll”)。
  2. 根据索引(“函数编号1")或名称("function blah")查找函数,并返回地址。
  3. 对所有相关函数重复步骤2。
  4. 当不再需要该库时,使用提供的句柄将其关闭。

如果步骤1失败了,那么你的库就不存在(或者“不能工作”),所以你不能调用其中的函数……

显然,有许多方法可以设计一个接口来提供这种类型的功能,而具体如何去做将取决于您的实际问题设置。

编辑:

为了阐明直接使用DLL和通过代码动态加载使用DLL之间的区别:

假设这是我们的"shared.h",它定义了共享库的函数(可能在真正的头文件中有一些declspec(...)exportsymbol或其他类似的东西,但现在我将完全忽略它)。

代码语言:javascript
复制
 int func1();
 char *func2(int x);

在一段直接使用DLL的代码中,您可以这样做:

代码语言:javascript
复制
 #include <shared.h>

 int main()
 {
     int x = func1();
     char *str = func2(42);

     cout << "x=" << x << " str=" << str << endl;
     return 0;
 }

非常直截了当,对吧?

当我们使用由代码动态加载的共享库时,它会变得相当复杂:

代码语言:javascript
复制
 #include <shared.h>

 typedef int (*ptrfunc1)();
 typedef char * (*ptrfunc2)(int x);

 int main()
 {
     SOMETYPE handle = loadlibrary("shared");
     if (handle == ERROR_INDICATOR)
     {
         cerr << "Error: Couldn't load shared library 'shared'";
         return 1;
     }
     ptrfunc1 pf1 = reinterpret_cast<ptrfunc1>(findfunc("func1"));
     ptrfunc2 pf2 = reinterpret_cast<ptrfunc2>(findfunc("func2"));

     int x = pf1();
     char *str = pf2(42);

     cout << "x=" << x << " str=" << str << endl;
     return 0;
 }

如你所见,代码突然变得更加“凌乱”。不要担心为了找到QObject的构造函数,或者更糟糕的是,从QObject继承的构造函数,您必须经历哪些困难。换句话说,如果你在你的代码中使用Qt,你可能不得不直接链接到"qt.lib“,如果你的机器上没有安装Qt环境,你的应用程序将会崩溃。

票数 4
EN

Stack Overflow用户

发布于 2013-04-10 20:16:33

如果LoadLibrary调用失败,那么您就可以知道动态库是否存在。此外,对于动态加载,您可以从动态库获取函数指针,如果指针为空,则平台在该平台上不支持该函数。

在windows上,您可以使用LoadLibrary API加载动态库。和GetProcAddress应用程序接口在库中查找所需的函数。如果对于您正在查找的特定函数,GetProcAddress返回NULL,则该功能在该平台上不存在。然后,您可以记录日志并决定后备。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15925361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档