【问题标题】:Deploying Visual C++ library DLLs as private assemblies将 Visual C++ 库 DLL 部署为私有程序集
【发布时间】:2011-05-18 09:33:32
【问题描述】:

此页面说明如何在您的应用中部署 VC++ 2008 库的本地副本,以避免安装 3rd-party vcredist。这对我很有用,因为它可以让我将压缩文件夹发送给用户,他们可以运行而无需使用不喜欢的安装程序。

但是,它对我不起作用。我的应用程序不使用 MFC,只使用 Win32,否则是标准 C++。我有app/MyApp.exe,仅此而已...我应该从%PROGDIR%\Microsoft Visual Studio 9.0\VC\Redist\x86 复制哪些文件以及它们应该去哪里?

我在 XP-Mode 虚拟 PC 上对此进行测试,当我尝试按照页面中的说明进行操作时,跨文件复制不会导致出现“应用程序初始化失败”错误。有没有我遗漏的步骤?

我查看了我的清单,似乎只使用了 CRT:http://pastebin.com/BD4NZMC2

【问题讨论】:

    标签: visual-studio-2008 visual-c++ dll side-by-side


    【解决方案1】:

    解决 DLL 地狱的最简单方法是使用 /MT 编译器标志(而不是默认的 /MD)重新编译您的应用程序。这将静态链接 C 运行时库。 如果这是一个独立的 exe,这将始终有效。

    如果没有(即您有自己的 DLL),您必须注意在同一个模块中分配和释放内存 - 也就是说,如果您 malloc() 可执行文件和 free() 中的一块内存相同DLL 中的指针,它将崩溃 - 因为可执行文件和 DLL 都将获得自己的堆,并且在不匹配的堆上尝试 free() 将不起作用。

    【讨论】:

    • 还有一大堆其他库静态链接到我的应用程序;这些都是使用 /MD 构建的,我收到链接器错误 - 我必须为所有这些创建新的构建配置,以使它们使用 /MT 构建。有必要吗?
    • 是的,/MT 和 /MD 编译对象不能混用。链接器不喜欢它。
    • 我得到了这项技术,避免了分发程序集的需要,但如果有人知道如何让它工作,我想知道。如果没人咬,这个答案可以加分!
    猜你喜欢
    • 2012-04-03
    • 2019-09-21
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    相关资源
    最近更新 更多