确定是否存在动态库的多平台方法
Multiplatform way to determine if a dynamic library is present
我需要检查是否存在动态库,以便稍后我可以安全地调用使用该库的函数。
是否有多平台的方法来检查这个?我的目标是MS Windows 7 (vc++ 11)和Linux (g++)。
要动态地"使用"共享库中的函数,要求该库不是可执行文件的一部分,因此您需要编写代码来加载库,然后使用该函数。可能有一些方法可以以可移植的方式做到这一点,但我不知道有任何可用的代码可以做到这一点。
这不是很难写的代码。作为"步骤",它包括以下内容:
- 加载给定文件名的库(例如:"xx",然后被翻译成"xx"。或"xx.dll"在特定于体系结构的代码中)。
- 根据索引("function number 1")或名称("function blah")找到一个函数,并返回地址。
- 对所有相关功能重复步骤2。 当不再需要该库时,使用提供的句柄关闭它。
如果步骤1失败,那么你的库不存在(否则"不工作"),所以你不能在其中调用函数…
显然,有很多方法可以设计一个界面来提供这种类型的功能,具体如何去做取决于你实际的问题设置是什么。
编辑:说明直接使用DLL和使用动态加载的DLL之间的区别:
假设这是我们的"shared.h",它定义了共享库的函数(在一个真正的标题中可能有一些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环境,你的应用程序将崩溃。
LoadLibrary调用应该失败,然后您可以知道动态库是否存在。在动态加载中,你从动态库中获取函数指针如果指针为空,那么平台就不支持该平台上的函数。
在windows上,你有LoadLibrary
API来加载动态库。和GetProcAddress
API在该库中查找所需的函数。如果GetProcAddress
为您正在寻找的特定函数返回NULL,则该功能不存在于该平台。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- 正在查找文档以获得PS4平台的C++中的设备信息
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 将vector<vector<double>>从x86平台中创建的一个进程发送到x64中构建的另一个进程的最快方法是什么
- 请告诉我在巴泽尔拥有多平台工作空间的更好方法
- 在C++中组织特定于平台的代码的推荐方法是什么?
- 有没有一种方法可以在一个平台上编写c++程序,而不需要为不同的操作系统重新编写
- 在c++中获得当前实例(例如pid)唯一值的独立于平台的方法是什么?
- 确定是否存在动态库的多平台方法
- 在Visual Studio 2010中有快速切换解决方案平台的方法吗?
- 在程序运行时隐藏控制台的独立于平台的方法