【问题标题】:Can g++ / minGW play nice with the Windows SDK? Is Visual Studio the only option?g++ / minGW 可以与 Windows SDK 配合使用吗? Visual Studio 是唯一的选择吗?
【发布时间】:2011-01-02 14:06:19
【问题描述】:

Windows XP 上的 g++ 和 minGW 可以使用 Windows SDK 吗?

具体来说,为什么g++编译失败:

#include <stdio.h>
#include <windows.h>

int main(void) {
 printf("!!!Hello World!!!");
 return EXIT_SUCCESS;
}

我尝试通过运行编译:

g++ -c -Wall  Test.cpp -IC:/Program\ Files/Microsoft\ Platform\ SDK/Include/

我收到一连串以

开头的编译错误
winnt.h:666:2: #error Must define a target architecture.

我已经安装了Windows Server 2003 SP1 Platform SDK

背景

我正在开发一个大型实时图像处理软件项目,到目前为止,该项目一直使用 g++、minGW 和 gnu 制作文件(手写)。对于新功能,我需要与具有SDK which was designed for Visual Studioframe grabber 交互。 framegrabber SDK 依赖于 Windows SDK 的头文件。

我需要学习 Visual Studio 还是有其他方法?

【问题讨论】:

标签: c++ windows visual-studio g++ mingw


【解决方案1】:

我每天都用MinGW编译Windows程序,零问题。您的安装一定有问题 - 请尝试Twilight Dragon Media 的版本。

编辑:只需重新阅读您的帖子 - 您不需要指定包含目录,并且可能不应该这样做。此外,您可能(或可能不需要)有点神秘的 -mwindows 标志。我刚刚使用 MinGW (TDM build) g++ 4.4.1 编译了你的程序,命令行:

g++ main.cpp

绝对没有问题。

更多信息:你知道 -mwindows 标志的作用,GCC 文档说:

此选项适用于 Cygwin 和 MinGW 目标。它指定一个 GUI 应用程序将由 指示链接器设置 适当的 PE 头子系统类型。

就我个人而言,我从未发现它有必要,但我的 Windows 应用程序都是命令行工具或服务器。

【讨论】:

  • 为什么不需要指定包含目录? g++ 如何知道包含文件在哪里?例如,当我包含我的 framegrabber SDK 时,我的编译器抱怨它找不到 crtDbg.h 包含文件。该头文件存在于 C:\Program Files\Microsoft Platform SDK\Include\crt\ 但 g++ 似乎并不知道它。
  • MinGW GCC 从它自己的包含目录中获取包含文件,该目录包含它自己版本的 windows 头文件。如果您需要指定“非标准”标头,那么您可能需要使用包含路径,但您应该确保它位于 GCC 默认路径之后。另外,如果你想编写可移植的代码,你需要注意文件名的大小写——你不应该使用混合大小写。
  • 我明白了。谢谢。包含路径的优先顺序是什么?传递给编译器的“-I”是否会覆盖 GCC 默认路径?
  • 另外,如果您想要幸福的生活,请在目录名中没有任何空格的路径中安装任何额外的头文件和库。请记住 GCC 是一个基于 UNIX 的工具链,而 UNIX 用户几乎从不创建包含空格的文件名,因此这些工具尚未针对此类名称进行过很好的测试。
  • 不记得优先级是什么 - GCC 手册可在 gcc.gnu.org/onlinedocs 获得。
【解决方案2】:

在包含这些窗口标题之前尝试添加这些定义

#define WINVER 0x0501
#define _WIN32_WINNT 0x0501

编辑:我的 gcc 也可以毫无问题地编译您的脚本(并且没有这些定义)。 我正在使用 mingw 的 gcc 4.40 (alpha ?!)

【讨论】:

  • 完全没有必要这样做。
【解决方案3】:

根据 MinGW 用户邮件列表中的讨论,您可能会遇到与 Windows SDK 的兼容性问题,您可能必须自己解决这些问题。


Georgi Petrov [2010 年 12 月 27 日;上午 8 点 33 分]:

你好,

我正在尝试开发 EVR(Vista/7 特定的视频演示 API) MSYS/MinGW 上 MPlayer 的渲染器。问题是我有 Windows SDK v7.1,我需要它的 evr.h。如果我尝试将其复制到 MinGW 的 include 目录以及它包含的 12 个头文件, 编译几乎是不可能的。 我有一大堆错误 包括evr.h,仅此而已。我调查发现我不能 直接将 Windows SDK 头文件与 MinGW 一起使用,因为它附带 有自己的头文件,有时非常非常不同。 问题在于 Media Foundation/Enhanced Video Renderer 标头 文件不是 MinGW 头文件的一部分。

我该怎么办?


罗斯里奇 [2010 年 10 月 10 日;晚上 10 点 16 分]:

在大多数情况下,Windows SDK 标头与 海湾合作委员会。如果您需要的某个特定头文件不存在 在 win32api heapers 或者缺少你需要的东西,那么你可以 尝试仅使用 Windows SDK 中的那个标头并使用 其余的 win32api。

也可以只使用 Windows SDK 头文件,避免使用 win32api 头文件,但你需要修复一些 关键头文件中的问题。我以前只是修改标题,但是 Windows SDK 实际上变得更兼容了,现在我 使用包装器来解决问题。

有些头文件和库差不多 从根本上与 GCC 不兼容,例如 GDI+。如果你想使用 GDI+,您需要使用 Microsoft 编译器。

                                    Ross Ridge

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2012-07-21
    • 2011-09-12
    • 1970-01-01
    相关资源
    最近更新 更多