【发布时间】:2014-03-27 02:52:26
【问题描述】:
编辑:
我放弃了使 SDK 正常工作,而是使用 MinGW 提供的 Windows 标头。至于 SDL 的问题,我只是注释掉了一些关于 Windows RT 的内容,就我而言,这可能没问题,因为我从不打算为移动设备编译。
我最近去抓取 Windows SDK 8.1 来替换 7.1,我不得不这样做,因为我去抓取 SDL 2.0.3 来替换 2.0.1,而 SDL 现在依赖于一个文件“winapifamily.h”,它是仅在 8.x SDK 而不是 7.x 中,这没什么大不了的……直到我转到我一直在从事的网络项目。我的代码不是问题,而是我的环境。现在设置了较新的 SDK,winnt.h 会导致大量问题。
C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h|940|error: #error Must define a target architecture.|
C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h|1311|error: 'EXCEPTION_DISPOSITION' does not name a type|
C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h|1320|error: 'EXCEPTION_ROUTINE' does not name a type|
C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h||In function 'BYTE ReadUCharAcquire(const volatile BYTE*)':|
C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h|8287|error: 'ReadAcquire8' was not declared in this scope|
C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h||In function 'BYTE ReadUCharNoFence(const volatile BYTE*)':|
C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h|8298|error: 'ReadNoFence8' was not declared in this scope|
C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h||In function 'void WriteUCharRelease(volatile BYTE*, BYTE)':|
C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h|8321|error: 'WriteRelease8' was not declared in this scope|
C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h||In function 'void WriteUCharNoFence(volatile BYTE*, BYTE)':|
C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h|8334|error: 'WriteNoFence8' was not declared in this scope|
C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h||In function 'WORD ReadUShortAcquire(const volatile WORD*)':|
C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h|8359|error: 'ReadAcquire16' was not declared in this scope|
C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h||In function 'WORD ReadUShortNoFence(const volatile WORD*)':|
C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h|8370|error: 'ReadNoFence16' was not declared in this scope|
C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h||In function 'void WriteUShortRelease(volatile WORD*, WORD)':|
C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h|8393|error: 'WriteRelease16' was not declared in this scope|
||More errors follow but not being shown.|
||Edit the max errors limit in compiler options...|
||=== Build finished: 10 errors, 0 warnings (0 minutes, 39 seconds) ===|
我已经篡改了我的环境大约八个小时,甚至重新安装了 MinGW,认为它可能有一些过时的头文件或库或其他东西。这可能是我错过的非常简单的事情,如果有人知道可能导致这些问题的原因,我将不胜感激。
Microsoft 是否只编写不可靠的标头? SDK 是否仅适用于 Visual Studio 编译器,如果是,为什么在许多 Windows 标头甚至 winnt.h 中都有很多字母“GNU”和“GCC”的实例?
【问题讨论】:
-
我希望。我尝试添加 -mwindows 并没有帮助。不过,我以前不需要它……只有新的 SDK 有这个问题。
-
我建议然后偷看 winnt.h 和 winapifamily.h 看看他们期待什么#defines - 它可能最终很简单,只需要你添加一个“-D
”到您的makefile中的CFLAGS变量... -
我担心如果我篡改文件会破坏某些东西,或者如果我定义了一些会使错误消失的东西,那么它会产生不一致,因为我从来不需要对7.x 开发工具包。所以也许是的,这是我需要添加的一些标志,但我不使用生成文件。这个 -D
你在说什么? -
您不需要更改这些文件中的任何内容,只需检查其中的#ifdef 类型 - 例如,如果您查看 winnt.h 中的第 940 行,您会看到它位于
#if...#else...#endif块内。然后,您将能够看到它期望看到的标志。当你知道它们是什么时,你可以像gcc -D<flag> myprog myprog.c一样调用 gcc