在静态库中使用 MFC

Posted

技术标签:

【中文标题】在静态库中使用 MFC【英文标题】:Use MFC in static Library 【发布时间】:2012-02-16 04:28:10 【问题描述】:

我已经使用“”选项创建了我的 MFC 应用程序。

我正在使用 Installshield 为我的应用程序创建安装。我应该在 installshield 中添加哪些依赖文件或“合并模块”?

是否需要添加“Microsoft C++ Runtime Library”或“Microsoft Visual C++ MFC”合并模块?

【问题讨论】:

【参考方案1】:

静态链接意味着 foo.lib 在链接器阶段嵌入到 myapp.exe 中。不存在对 foo.dll 的依赖,也不需要重新分发。您还应该了解,虽然静态链接使您的部署更容易,但它实际上被认为是一个安全漏洞,因为如果在 foo.lib/foo.dll(在本例中为 MFC)中发现了漏洞,那么 Microsoft 无法通过更新版本来修补您的应用程序在 WinSXS 缓存中。您可以在构建机器上包含最新的 redist,然后重新构建和重新部署。

我强烈建议创建一个具有基本快照的虚拟机,该快照代表您想要支持的最旧操作系统,然后在那里测试您的安装程序。这将有助于识别缺失的依赖关系,然后可以使用 Dependency Walker、ILDasm/.NET Reflactor 和 ProcessMon 等工具来解决这些依赖关系。

【讨论】:

感谢您的清晰解释。这给了我静态链接 Mfc 的优点/缺点。【参考方案2】:

至少如果没有记错的话,不会。如果在静态库中使用 MFC,还需要静态链接到标准库。除非您在其他 DLL 上添加了其他依赖项,否则您应该有一个独立的可执行文件。

如果您愿意,您可以/可以与 dependency walker 确认一下。

【讨论】:

谢谢。我在我的应用程序中使用了 MSXML。所以我在 installshield 中添加了 MSXML dll。如果我们使用静态 MFC 库,我不确定是否添加“C++ 运行时库”合并模块。我会尝试依赖walker。【参考方案3】:

很多时候我们面临的问题是 exe 和 dll 的大小比以前的版本要大。 这可以使用项目属性来解决

菜单“项目” - 特性... 配置属性--->“使用MFC 在静态库中使用MFC” 和

在“C/C++选项”-->选项卡“代码生成”-->为静态MFC选择“多线程/MT”。

如果我们选择上述选项,那么我们不需要在 PC 上安装 VC2008 Redistributable,并且 exe 或 dll 的大小更小

【讨论】:

以上是关于在静态库中使用 MFC的主要内容,如果未能解决你的问题,请参考以下文章

在共享DLL中使用MFC与在静态库中使用MFC的区别

在共享DLL中使用MFC 和在静态库中使用MFC的区别

静态库中的对话框资源

mfc 时钟 OnTimer 非静态成员函数的非法调用

MFC 静态链接未解析的外部符号

我可以在 Windows 中静态链接 ws2_32.lib 吗? c++ MFC