如何在 windows 7/visual studio 2008 下为 windows XP 编译

Posted

技术标签:

【中文标题】如何在 windows 7/visual studio 2008 下为 windows XP 编译【英文标题】:How do I compile for windows XP under windows 7 / visual studio 2008 【发布时间】:2011-02-04 14:55:43 【问题描述】:

我正在运行 Windows 7 和 Visual Studio 2008 Pro,并试图让我的应用程序在 Windows XP SP3 上运行。

这是一个非常小的命令行程序,所以应该有任何可笑的依赖:

// XPBuild.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])

    printf("Hello world");
    getchar();
    return 0;

我在某处读到defining several constants such as WINVER 应该允许我为其他平台编译。我已经尝试将以下内容添加到我的 /D 编译器选项中:

;WINVER=0x0501;_WIN32_WINNT 0x0501;NTDDI_VERSION=NTDDI_WINXP

但这并没有什么不同。当我在我的 Windows XP 机器上运行它时(实际上是在 virtualbox 中运行),我收到以下错误:

此应用程序无法启动,因为应用程序配置不正确。重新安装应用程序可能会解决此问题。

那么我错过了什么?运行 MSVC 编译程序或不同的编译器选项或其他东西是否需要其他东西?

【问题讨论】:

不管怎样,最小的标准应用程序是int main(),如果你想试试的话。对于使用标准库的东西,可能是:#include <iostream> int main()std::cout << std::endl; 是的,但我想要一些能吐出一些输出并在消失前暂停的东西。 不管怎样,最小的标准应用是 int main()return 0; @gregschlom:return 0; 在 C99 和 C++ 中是可选的。 【参考方案1】:

只需在项目设置中将编译器设置为使用静态链接(项目 -> 属性 -> 配置属性 -> C/C++ -> 代码生成 -> 将“运行时库”更改为 /MT 或 /MTd 而不是默认值/MD 或 /MDd)

【讨论】:

非常适合我!【参考方案2】:

Michael 的回答解释了为什么它对您不起作用,以及您应该怎么做。关于WINVER - 从某种意义上说,它们不会改变您的二进制文件的任何内容,因为它会突然开始在 XP 上运行。他们所做的是禁用WINVER 指定的操作系统版本不支持的 Windows 头文件中的函数和类型声明。这样可以确保您不会意外调用,例如一些仅适用于 Vista 的功能。但是,您并不严格需要它 - 如果您的代码不依赖于任何仅 Vista/7 的功能,您可以在不重新定义 WINVER 的情况下进行编译,它仍然可以在 XP 上正常工作.

【讨论】:

【参考方案3】:

您错过的很可能是 VC++ 程序需要安装运行时(除非您静态链接,这不是默认设置) - 您显示的错误消息正是您得到的错误消息,如果它们不按顺序.

尝试在 XP 机器上安装 Microsoft Visual C++ 2008 SP1 Redistributable Pack - 您很可能会发现您的程序无需任何更改即可运行。

【讨论】:

另外,更改为静态链接运行时的选项可能效果很好。 或者,使用静态运行时库进行编译:转到“项目属性 -> C/C++ -> 代码生成 -> 运行时库”,然后选择名称中不带“DLL”的选项。 是的,安装 Visual Studio SP1 可以解决问题。

以上是关于如何在 windows 7/visual studio 2008 下为 windows XP 编译的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 上构建/调试(完整)LibTorch 源?

如何在 Win 7 Visual Studio 2012 的 C# 中禁用#if DEBUG

如何使用会话ID从php mysql中的两个或多个表中获取值

求大神,关于c语言删除函数

If(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1) 是啥意思?

(fwrite(&stud[i],sizeof(struct student),1,fp)!=1在C语言中是啥意思