【发布时间】:2016-11-28 04:23:25
【问题描述】:
我希望我的 Windows 应用程序能够引用包含在 DLL 中的大量类和函数,但我需要能够引导应用程序在加载该 DLL 之前选择正确版本。我熟悉使用 dllexport / dllimport 和生成导入库来完成加载时动态链接,但我似乎无法在互联网上找到任何关于可能在导入库本身中找到某种入口点函数的信息,所以具体来说,我可以使用 CPUID 来检测主机 CPU 配置,并根据该信息决定加载特定的 DLL。更具体地说,我想构建 DLL 的 2 个版本,一个使用 /ARCH:AVX 构建并充分利用 SSE - AVX 指令,另一个假设没有比 SSE2 更新的版本。
一个要求:要么必须在加载时链接 DLL,要么需要一种超级简单的方法来手动绑定从 DLL 外部引用的函数,并且有很多,主要是封装在类中。
额外问题:由于我的库将是跨平台的,是否有基于 Linux 的共享对象的等价物?
【问题讨论】:
-
使用工厂模式来获得你想要的任何实现?
-
我会用自定义的helper function 查看delay-loaded DLLs。帮助程序应该能够在运行时确定要加载哪个 DLL。
-
一个更简单的选择:在应用程序启动期间将延迟加载与调用SetDllDirectory/AddDllDirectory结合起来。不太灵活,因为所有相关的 DLL 必须共享相同的名称,并且位于不同的目录中。
-
我阅读了一些关于延迟加载的内容,但很明显我必须将其设置为可执行应用程序中的链接器设置(真的?),我宁愿不这样做,但也许没关系,因为我可以在其使用中记录该要求。
标签: c++ windows dll load-time cpuid