gpt4 book ai didi

c++ - 确定动态库是否存在的多平台方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:30:16 26 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

如果第 1 步失败,那么您的库不存在(或者“无法工作”),因此您无法调用其中的函数...

显然,有很多方法可以设计一个界面来提供这种类型的功能,具体如何实现取决于您的实际问题设置。

编辑:

澄清直接使用 DLL 和使用从代码动态加载的 DLL 之间的区别:

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

 int func1();
char *func2(int x);

在一段直接使用 DLL 的代码中,您只需:

 #include <shared.h>

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

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

很简单,对吧?

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

 #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 环境,您的应用程序将会崩溃。

关于c++ - 确定动态库是否存在的多平台方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15925361/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com