c++ - 加载时动态链接库调度

标签 c++ windows dll load-time cpuid

我希望我的 Windows 应用程序能够引用包含在 DLL 中的一组广泛的类和函数,但我需要能够引导应用程序在加载此 DLL 之前选择正确的版本。我熟悉使用 dllexport/dllimport 和生成导入库来完成加载时动态链接,但我似乎无法在互联网上找到任何关于可能在导入库本身中找到某种入口点函数的信息,所以具体来说,我可以使用 CPUID 来检测主机 CPU 配置,并根据该信息决定加载特定的 DLL。更具体地说,我想构建一个 DLL 的 2 个版本,一个是用 /ARCH:AVX 构建的,并充分利用 SSE - AVX 指令,另一个假设没有任何可用的更新比 SSE2.

一个要求:DLL 必须在加载时链接,或者需要有一种 super 简单的方法来手动绑定(bind)从 DLL 外部引用的函数,并且有很多,大部分包装在类中。

额外的问题:由于我的库将是跨平台的,是否有基于 Linux 的共享对象的等效项?

最佳答案

我建议您尽可能避免从可执行文件中动态解析 DLL,因为这只会让您的生活变得艰难,尤其是因为您有很多暴露的接口(interface),而且它们不是纯 C 语言。

可能的解决方法

创建一个“选择器”进程,提供必要的 UI 来决定您需要哪个 DLL,或者它甚至可以自动确定它。让该过程将已确定的任何 DLL 移动到您的主要可执行文件所期望的标准位置(和名称)。然后让选择器进程启动您的主要可执行文件;它将从您的标准位置获取其 DLL,而不必知道那里有哪个版本的 DLL。没有延迟加载,没有不稳定,没有额外的编码;非常简单。

如果这不适合您,那么这里是您延迟加载 DLL 的起点。这是一条崎岖得多的道路。

Windows

Linux

关于c++ - 加载时动态链接库调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38557372/

相关文章:

c++ - 我们可以在将对象转换为 (char *) 后取回对象吗

c++ - 使用 boost asio 接收文本的最有效方式?

c - wglCreateContext 失败,错误为 "The pixel format is invalid"

c++ - 如何在Windows应用程序中使用cmake获得管理员特权?

c# - 结合 C# 和 C 的优点/缺点

c# - 为什么类库 (dll) 不生成 lib 文件?

C++ - 返回 C++11 std::array

c++ - 从另一个类访问 MainWindow 类成员

windows - 无法安装 emacs el-get 包,emacs 无法连接到互联网

dll - 在 .dll 中包含 .lib,程序将其用作插件