在 Code::Blocks 中编译 SDL 时出现 "winapifamily.h: No such file or directory" 错误提示。

49

我正在跟随LazyFoo的SDL2.0教程,使用Code::Blocks 13.12。在VS2010上链接和运行SDL2没有问题,但现在我换了IDE并遇到了这个错误:

winapifamily.h: 没有那个文件或目录

我认为一切都已经正确链接了。我已将程序指向我的SDL2包含和库目录。

构建日志:(错误出现在文件:..\include\SDL2\SDL_platform.h)

=== 构建:SDL2_Setup的Debug(编译器:GNU GCC Compiler) ===

致命错误:winapifamily.h: 没有那个文件或目录

=== 构建失败:1个错误,0个警告(0分钟,0秒)===

这是我第一次在这里提问。我已经在Google上寻找答案并搜索了现有的问题/答案,但无法解决这个问题。下面是我的代码。

我的代码:

// Using SDL and standard IO
#include <SDL.h>
#include <stdio.h>

// Screen dimension constants
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

int main( int argc, char* args[] )
{
    // The window we'll be rendering to
    SDL_Window* window = NULL;

    // The surface contained by the window
    SDL_Surface* screenSurface = NULL;

    // Initialize SDL
    if( SDL_Init( SDL_INIT_VIDEO) < 0 )
    {
        printf( "SDL could not initialize! SDL_GetError: %s\n", SDL_GetError() );
    }
    else
    {
        // Create window
        window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
        if( window == NULL )
        {
            printf( "Window could not be created! SDL_GetError: %s\n", SDL_GetError() );
        }
        else
        {
            // Get window surface
            screenSurface = SDL_GetWindowSurface( window );

            // Fill the surface white
            SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, 0xFF, 0xFF, 0xFF));

            // Update the surface
            SDL_UpdateWindowSurface( window );

            // Wait two seconds
            SDL_Delay( 2000 );
        }
    }

    // Destroy window
    SDL_DestroyWindow( window );

    // Quit SDL subsystems
    SDL_Quit();

    return 0;
}

我认为VS 10没有这个头文件。这是一个新的头文件。检查一下你的项目是否缺少了一些关于操作系统类型的宏定义。 - SHR
3个回答

64

像魔法一样!使用mingw在ubuntu(主机)上为Windows 64位(目标)进行编译,遵循此教程 http://www.willusher.io/sdl2%20tutorials/2013/08/15/lesson-0-mingw/ (没有使用cmake,而是直接使用mingwmakefile),但也出现了相同的错误。我只是将此文件放置到SDL2-2.0.3/x86_64-w64-mingw32/include/SDL2中(这是我包含的头文件),问题就解决了。与该版本唯一的区别是条件语句中的一行发生了变化。谢谢David。以防万一这个dropbox消失了……这个文件是否已提交到主要repo中? - Xavi Montero
是的,更改已提交到官方的SDL2存储库。 - David Ludwig
3
补充一点:这项更改是在2.0.3版本之后提交的。下一个版本应该包含此修复程序。在发布该版本之前,如果Dropbox链接失效,这是另一个已修复副本的链接:https://hg.libsdl.org/SDL/raw-file/e217ed463f25/include/SDL_platform.h - David Ludwig
2
当使用WinXP兼容工具集vs140_xp时,此问题会在SDL2 2.0.4中与Visual Studio 2015 U3一起返回。似乎自U3以来,宏_USING_V110_SDK71_不再自动设置。我不确定这是SDL2的问题还是VS2015U3的问题。 - Zsar
Sahib,我建议您获取最新版本的SDL,目前版本为2.0.5,在撰写本文时可用。下载地址:http://libsdl.org/download-2.0.php。 - David Ludwig
显示剩余2条评论

11

一种快速解决方法。在SDL_platform.h文件中注释掉121至132行,包括这些行。 当错误发生时,该文件会加载到C::B中。保存它并继续构建!


1
我遇到了那个问题。前往 <\p>
C:\Program Files (x86)\Windows Kits\8.0\Include\shared

在编程中寻找winapifamily.h,然后将其复制到您的文件中。保留HTML格式。
..\Mingw\Include\ folder

编辑:我认为我有Windows Kits文件,因为我安装了Visual Studio 2012或更高版本,抱歉。我很高兴你能解决你的问题。

是的,问题出在这个头文件中(SDL 2.0.3版本中的117到134行):

#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__)
/* Try to find out if we're compiling for WinRT or non-WinRT */
/* If _USING_V110_SDK71_ is defined it means we are using the v110_xp or v120_xp toolset. */
#if defined(__MINGW32__) || (defined(_MSC_VER) && (_MSC_VER >= 1700) && !_USING_V110_SDK71_)    /* _MSC_VER==1700 for MSVC 2012 */
#include <winapifamily.h>
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#undef __WINDOWS__
#define __WINDOWS__   1
/* See if we're compiling for WinRT: */
#elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
#undef __WINRT__
#define __WINRT__ 1
#endif
#else
#undef __WINDOWS__
#define __WINDOWS__   1
#endif /* _MSC_VER < 1700 */
#endif /* defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) */

我的C盘上没有“Windows Kits”文件夹。这是Windows 8的特性吗?我使用64位Win 7操作系统。 - user3427293
1
就在我发出这个问题后(写作时已经过去2个小时),通过进一步的谷歌搜索,我在别处得到了答案。这个替代方案可以解决SDL_platform.h问题:http://www.marshut.com/irzuki/sdl-platform-h.html - user3427293
1
以上链接已损坏。 - marknuzz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接