【问题标题】:How to build C++ app which runs on plain old XP SP2 with Visual Studio 2008 and no Side-by-Side DLLs?如何使用 Visual Studio 2008 构建在普通旧 XP SP2 上运行且没有并行 DLL 的 C++ 应用程序?
【发布时间】:2010-10-16 01:20:06
【问题描述】:

我想通过调用WinExec 来编译一个C++ 项目,以便使用一些命令行参数启动另一个可执行文件。我不知道在我的项目中要指定哪些设置才能生成不需要 Microsoft 并行 DLL 的可执行文件,我不想在我的目标系统上安装它。有什么提示吗?

症状是应用程序无法启动并且以下事件被写入应用程序日志(免费翻译自法语):

Error, SideBySide, event #33
Microsoft.VC90.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8" cannot be found. 

更新:我知道使用 WinExec 是不好的做法,但它的作用就像一个魅力,而且微软不可能在任何未来的 API 版本中删除它,不是吗?

【问题讨论】:

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


    【解决方案1】:

    如果您指定要静态链接运行时(/MT 或 /MTd),您应该很好。项目属性->C/C++->代码生成->运行时库

    【讨论】:

      【解决方案2】:

      如果您只需要 CreateProcess/ShellExecute(WinExec 自 NT 3.1/Win 95 起已弃用),则根本不需要任何运行时库。在 Project Properties / Configuration / Linker / Input 中启用 Ignore All Default Libraries 并将 kernel32.lib 添加到 Additional Dependencies

      【讨论】:

        【解决方案3】:

        jachymko 和 Josh 已(部分)回答了该解决方案。这是完整的解决方案:

        1. Project Properties / Configuration / Linker / Input / Ignore All Default Libraries 设置为 Yes 并将 kernel32.lib 添加到 其他依赖项。仅此一项不会链接,因为代码会自动引用 __security_check_cookie_WinMainCRTStartup

        2. 移除 /GS 开关以指示编译器不要注入安全检查代码。为此,请将 Project Properties / Configuration / C/C++ / Code Generation / Buffer Security Check 设置为 No

        3. 项目属性/配置/C/C++/代码生成/运行时库设置为多线程(/MT)

          李>
        4. Visual Studio 2008 生成的初始代码包含一个名为_tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)入口点。通过将其重命名为 WinMain 来修改它,并将第三个参数转换为 LPSTR

        5. 项目属性/配置/链接器/高级/入口点设置为WinMain

        通过对默认 C++ 项目的这些更改,代码最终编译和链接,并在新安装的缺少运行时库的 Vista 或 XP 上运行。

        【讨论】:

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