Par*_*bay 5 c++ g++ visual-c++ dynamic-library
我需要检查是否存在动态库,以便以后可以安全地调用使用该库的函数。
有没有多平台的方式来检查这一点?我的目标是MS Windows 7(VC ++ 11)和Linux(g ++)。
要动态“使用”共享库中的函数,要求该库不是可执行文件的一部分,因此您需要编写代码来加载该库,然后使用该函数。很可能有多种方法可以以可移植的方式做到这一点,但我不知道有任何代码可以做到这一点。
编写代码并不难。作为“步骤”,它涉及以下内容:
如果步骤 1 失败,则您的库不存在(或者“无法工作”),因此您无法调用其中的函数...
显然,设计接口来提供此类功能的方法有很多,具体如何实现取决于您的实际问题设置。
编辑:
为了澄清直接使用 DLL 和使用从代码动态加载的 DLL 之间的区别:
想象一下,这是我们的“shared.h”,它定义了共享库的函数(真实的头文件中可能有一些declspec(...)或exportsymbol其他这样的东西,但我现在完全忽略它)。
int func1();
char *func2(int x);
Run Code Online (Sandbox Code Playgroud)
在直接使用 DLL 的一段代码中,您只需执行以下操作:
#include <shared.h>
int main()
{
int x = func1();
char *str = func2(42);
cout << "x=" << x << " str=" << str << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
很简单,对吧?
当我们使用由代码动态加载的共享库时,它会变得更加复杂:
#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;
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,代码突然变得更加“混乱”。不要介意你必须跳过哪些障碍才能找到 的构造函数QObject,或者更糟糕的是,从 继承QObject。换句话说,如果您在代码中使用 Qt,您可能会被迫直接链接到“qt.lib”,并且如果计算机上未安装 Qt 环境,您的应用程序将崩溃。
| 归档时间: |
|
| 查看次数: |
2663 次 |
| 最近记录: |