加载时动态链接库调度

问题描述 投票:2回答:2

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

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

奖金问题:由于我的库是跨平台的,是否有基于Linux的共享对象?

c++ windows dll load-time cpuid
2个回答
1
投票

我建议你尽可能避免从你的可执行文件动态解析你的DLL,因为它只会让你的生活变得艰难,特别是因为你有很多暴露的接口而且它们不是纯粹的C.

可能的解决方法

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

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

视窗

Linux的


0
投票

要添加到qexyn的答案,可以通过生成一个小的静态存根库来模仿Linux上的延迟加载,这将使dlopen首次调用它的任何函数,然后将实际执行转发到共享库。可以通过自定义项目特定脚本或Implib.so自动生成此类存根库的生成:

# Generate stub
$ implib-gen.py libxyz.so
# Link it instead of -lxyz
$ gcc myapp.c libxyz.tramp.S libxyz.init.c
© www.soinside.com 2019 - 2024. All rights reserved.