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

我已经使用“在静态库中使用 MFC”选项创建了我的 MFC 应用程序。

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

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

【问题讨论】:

    标签: visual-c++ mfc installation static-libraries installshield


    【解决方案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 的大小更小

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多