3

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

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

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

4

2 回答 2

1

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

可能的解决方法

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

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

视窗

Linux

于 2016-07-25T00:52:17.070 回答
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
于 2018-02-16T09:30:54.297 回答