使用 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.DLL
U.DLL
M.EXE
NODE.DLL
NODE.DLL
O.DLL
U.DLL
\C\BIN\U.DLL
U.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
。它们来自第三方,因此无法更改静态链接。我也没有使用LoadLibrary
on的选项O.DLL
,因为它是一个 C++ 库,提供了一个导入库。
我相信可以使用清单,这样当我构建NODE.DLL
静态链接到 O.DLL 的内容时,我会在清单中进行设置,NODE.DLL
以便O.DLL
加载它自己的副本,U.DLL
该副本安装在\C\BIN\U.DLL
. 我只是无法弄清楚如何做到这一点。理想情况下,我不想修改 的清单O.DLL
,但如果这是唯一的解决方案,我会接受的。