删除 MFC DLL 项目的外部依赖项

Posted

技术标签:

【中文标题】删除 MFC DLL 项目的外部依赖项【英文标题】:Removing external dependencies to MFC DLL project 【发布时间】:2010-09-30 14:36:01 【问题描述】:

我正在 VS2008 中开发一个 MFC DLL 项目。 dll 编译正常,我可以从承包商为我开发的 GUI exe 中调用它。需要为我的 dll 安装 Visual C++ Redistributables(也可能是用 C++ 开发的 exe)

另一家公司想要许可我的 dll 与他们的 C++ exe 一起使用。他们要求我的 dll 没有外部依赖项。是否可以编译我的 dll 以删除所有外部依赖项,如 Visual C++ Redistributables?

设置 /MT 会这样做吗? 我已经阅读了Should I compile with /MD or /MT?,这有些道理,但我担心 dll 地狱。

这会导致 exe 调用我的 dll 时出现问题吗?我在某处读到有关 exe 和 dll 需要使用相同的 Visual C++ Redistributables 或其他东西的信息。

我对 C++ 有点陌生。任何建议表示赞赏。

【问题讨论】:

【参考方案1】:

您可以链接到 CRT 的静态版本(是的,/MT),但它非常危险。您必须仔细检查您的出口。确保它们都不返回 C++ 对象,甚至不返回 std::string(或 CString)。或者客户端代码必须释放的任何指针。这会很糟糕,因为客户端将拥有自己的 CRT 副本并使用不同的堆。这将泄漏返回的对象/指针,当 Vista 和 Win7 上的安全堆管理器检测到指针不属于堆时,程序会崩溃。

“外部依赖”究竟是什么意思可能是一个争论的问题。对 CRT 的依赖并不完全是外部的。但是,您必须向他们提供基于他们使用的相同版本的 Visual Studio 构建的 DLL 版本。只有在版本匹配的情况下才能共享 CRT。

【讨论】:

【参考方案2】:

为什么不将所有依赖的 dll 打包成一个安装程序包并发布给您的客户?

我看到有些软件包确实包含了vc的依赖库....

【讨论】:

以上是关于删除 MFC DLL 项目的外部依赖项的主要内容,如果未能解决你的问题,请参考以下文章

发布版本依赖于 MFC 的调试 dll

在 MFC 项目中删除对某些 ActiveX 库的依赖的最简单方法是啥?

没有 .net 依赖项的 Windows 安装项目

仅将 CString 和 CArray 包含到 C++ 项目中

如何在 Eclipse 中从我的 Android 项目中删除依赖项

如何正确删除 Maven 项目中的依赖项