使用 Visual Studio c++ V10,我试图弄清楚如何构建 DLL 并解决 DLL 命名冲突。这是详细信息。
S 公司运送了一种名为 的产品M.EXE。假设M.EXE安装在\S\BIN\M.EXE. 公司 S 静态链接到一个名为 的 DLL U.DLL,该 DLL 安装在 \S\BIN\U.DLL. U.DLL包含开源代码,并使用 Visual C++ 编译器选项构建/Zc:wchar_t-,它不将 wchar 识别为本机类型。
C 公司发布了一个名为 的 DLL O.DLL,并发布了该 DLL 的 API,并发布了一个用于O.DLL. 假设O.DLL安装在\C\BIN\O.DLL. O.DLL静态链接到名为 DLL 的 DLL U.DLL,该 DLL 安装在\C\BIN\U.DLL. U.DLL构建在相同的开源代码上,但使用 Visual C++ 编译器选项构建/Zc:wchar_t,它可以识别wchar_t为本机类型。
理想情况下,C 公司和 S 公司同意U.DLL使用相同的 Visual C++ 选项进行构建,但这是不可能的。
M.EXE来自 Company S 的产品是可扩展的,因为我可以在非托管 C++ 中构建自己的 DLL,如果我正确设置所有内容,NODE.DLL调用它将调用它。M.EXE我想构建它NODE.DLL,使其静态链接到O.DLL来自 Company C。但问题是,一旦运行,M.EXE它就U.DLL从公司。因此,当尝试加载时,它会失败,因为当加载时,需要的符号不存在,因为 Windows 认为已经加载。\S\BIN\S\BIN\U.DLL\C\BIN\U.DLLU.DLLM.EXENODE.DLLNODE.DLLO.DLLU.DLL\C\BIN\U.DLLU.DLL
情况示意图如下:
M.EXE static link to -> \S\BIN\U.DLL
M.EXE dynamic link to -> NODE.DLL
NODE.DLL static link to O.DLL
O.DLL static link to \C\BIN\U.DLL
实际上,我需要\S\BIN\U.DLL和\C\BIN\U.DLL共存于同一进程空间中,并M.EXE使用其版本U.DLL和O.DLL使用其版本U.DLL.
请注意,我没有重建M.EXE或O.DLL更改它们各自加载方式的选项U.DLL。它们来自第三方,因此无法更改静态链接。我也没有使用LoadLibraryon的选项O.DLL,因为它是一个 C++ 库,提供了一个导入库。
我相信可以使用清单,这样当我构建NODE.DLL静态链接到 O.DLL 的内容时,我会在清单中进行设置,NODE.DLL以便O.DLL加载它自己的副本,U.DLL该副本安装在\C\BIN\U.DLL. 我只是无法弄清楚如何做到这一点。理想情况下,我不想修改 的清单O.DLL,但如果这是唯一的解决方案,我会接受的。