删除 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 项目中删除对某些 ActiveX 库的依赖的最简单方法是啥?
仅将 CString 和 CArray 包含到 C++ 项目中