问题的简短文本如下:
我是否有可能指示微软的命令行C++编译器链接到动态库,并告诉链接器不要链接到该DLL中的一个特定函数,考虑到该函数的名称(损坏或未损坏)或它的序号,以便与不包含该函数的库的早期版本保持兼容性?
长篇的解释是:
我正在开发一个DLL,它是Autodesk Maya 2020的插件。这个DLL需要链接到Maya 2020的一个名为OpenMayaUI的动态库。
通常,为玛雅的一个主要版本(如2020年)构建的插件应该是二进制的,与该主要版本的任何其他次要版本都是兼容的。例如,使用Maya 2020.4构建的插件应该仍然加载在Maya 2020.0中.
然而,Autodesk在Maya 2020.3版本的OpenMayaUI.dll中引入了一个新的功能,它在Maya 2020.0、Maya 2020.1或Maya 2020.2中没有出现。因此,如果我构建我的插件,以便将其链接到来自Maya 2020.3或2020.4的OpenMayaUI.lib版本,尝试加载早期版本的Maya 2020的插件将失败,“找不到指定的过程”。(这是正确的,在早期版本的OpenMayaUI.dll中没有提供这个过程。)然而,链接到玛雅2020.0版本的OpenMayaUI.lib将产生一个可由任何版本的玛雅2020年加载的动态链接库。
不幸的是,构建我的插件的脚本需要能够在安装了任何版本的Maya 2020 (包括2020.3和2020.4 )的系统上运行。但我需要它生成的构建,以兼容玛雅2020.0,尽管如此。
那么,我是否有可能链接到Maya 2020.4版本的OpenMayaUI.lib,但以某种方式告诉链接器避免链接到动态库中的特定函数,而这个函数在Maya 2020.0版本的OpenMayaUI中并不存在?在本例中,我知道函数的确切名称,包括损坏的和未损坏的,并且我知道它在OpenMayaUI.dll的2020.0和2020.4版本中的序号。
我正在使用VisualStudio2019附带的微软命令行C++编译器构建插件。
编辑附加信息:违规函数是Maya的C++类中的一个虚拟成员函数,所以即使我没有调用它,我的DLL仍然会被链接到它。
发布于 2022-10-22 15:51:11
我是否有可能链接到Maya 2020.4版本的OpenMayaUI.lib,但以某种方式告诉链接器避免链接到动态库中没有出现在OpenMayaUI的玛雅2020.0版本中的特定函数?
是。告诉链接器OpenMayaUI.dll将是延迟加载的。
这样,您的代码从DLL中调用的每个函数都不会被静态地链接到插件的IMPORTS表中,而是在第一次调用时通过LoadLibrary()和GetProcAddress()在运行时加载。这样,您的插件就有机会在调用缺失的函数之前验证DLL的版本。
https://stackoverflow.com/questions/74133087
复制相似问题