我希望我的Windows应用程序能够引用包含在DLL中的大量类和函数,但是我需要能够指导应用程序在加载之前选择正确版本的DLL。我熟悉使用dllexport / dllimport并生成导入库来完成加载时动态链接,但我似乎无法找到关于可能在导入库本身中找到某种入口点函数的interwebs的任何信息,所以具体来说,我可以使用CPUID来检测主机CPU配置,并根据该信息决定加载特定的DLL。更具体地说,我想建立一个DLL的两个版本,一个用/ARCH:AVX
构建并充分利用SSE-AVX指令,另一个假设没有什么比SSE2更新。
一个要求:DLL必须在加载时链接,或者需要一种非常简单的方法来手动绑定从DLL外部引用的函数,并且有很多,主要包含在类中。
奖金问题:由于我的库是跨平台的,是否有基于Linux的共享对象的等价物?
答案 0 :(得分:1)
我建议你尽可能避免从你的可执行文件中动态解析你的DLL,因为它只会让你的生活变得艰难,特别是因为你有很多暴露的接口而且它们不是纯粹的C.
可能的解决方法
创建一个“选择器”进程,该进程提供必要的UI以决定您需要哪个DLL,或者甚至可以自动确定它。让该进程将任何已决定的DLL移动到主要可执行文件所期望的标准位置(和名称)。然后让选择器进程启动您的主要可执行文件;它将从您的标准位置获取其DLL,而无需知道哪个版本的DLL存在。没有延迟加载,没有笨拙,没有额外的编码;很容易。
如果这不适合您,那么这里是延迟加载DLL的起点。这是一条更加崎岖的道路。
<强>窗强>
<强>的Linux 强>
答案 1 :(得分: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