【问题标题】:"winapifamily.h: No such file or directory" when compiling SDL in Code::Blocks在 Code::Blocks 中编译 SDL 时出现“winapifamily.h:没有这样的文件或目录”
【发布时间】:2014-04-22 03:57:29
【问题描述】:

我正在关注 LazyFoo 的 SDL2.0 教程,使用 Code::Blocks 13.12。我在 VS2010 中链接和运行 SDL2 没有任何问题,但更改了 IDE 并遇到此错误:

winapifamily.h: 没有这样的文件或目录

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

Buildlog:(文件中出现错误:..\include\SDL2\SDL_platform.h)

=== 构建:在 SDL2_Setup 中调试(编译器:GNU GCC 编译器)===

致命错误:winapifamily.h:没有这样的文件或目录

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

这是我第一次在这里提问。我在谷歌上搜索了答案并在这里搜索了现有的问题/答案,但无法解决问题。这也是我的代码。

我的代码:

// 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 没有这个头文件。这是一个新的标题。检查您的项目是否有或缺少一些关于操作系统类型的宏。

标签: c++ sdl codeblocks sdl-2


【解决方案1】:

更新:SDL 2.0.4 现已发布,包含对此错误的修复,可通过http://libsdl.org/download-2.0.php 下载


这是 SDL 2.0.3 中的一个错误。已为 SDL 的下一个版本提交了修复程序。同时,这里是 SDL_platform.h 的固定副本的链接:

https://hg.libsdl.org/SDL/raw-file/e217ed463f25/include/SDL_platform.h

如果您将文件放入 SDL 2.0.3 的 include\SDL2\ 目录,覆盖原始文件,您的应用程序应该可以编译。

【讨论】:

  • 就像一个魅力! - 在带有mingw 的Windows 64 位(目标)的ubuntu(主机)中编译,遵循这个tuto willusher.io/sdl2%20tutorials/2013/08/15/lesson-0-mingw(没有cmake,对于makefile 直接使用makefile),同样的错误也失败了。我刚刚将此文件放入SDL2-2.0.3/x86_64-w64-mingw32/include/SDL2(这是我包含的标题),它解决了问题。与该版本的唯一差异是 if 中的一个条件,它改变了它的行。谢谢大卫。以防万一这个保管箱消失......这个文件是否已提交到主仓库??
  • 是的,更改已提交给官方 SDL2 存储库。
  • 补充一点:该更改是在 2.0.3 之后提交的。下一个版本应该包含修复。在发布该版本之前,如果 Dropbox 链接失效,这里是固定副本的另一个链接:hg.libsdl.org/SDL/raw-file/e217ed463f25/include/SDL_platform.h
  • 当使用 WinXP 兼容性工具集 vs140_xp 与 Visual Studio 2015 U3 一起使用时,此问题在 SDL2 2.0.4 中返回。似乎从 U3 开始,宏 _USING_V110_SDK71_ 不再自动设置。我不清楚这是 SDL2 的问题还是 VS2015U3 的问题。
  • Zsar,我无法使用 SDL 2.0.4 或来自 hg.libsdl.org/SDL 的最新 SDL2 代码重现您的错误。您是否有机会向我发送有关您如何复制此内容的更多信息?如果 SDL 中存在错误,如果可能的话,我希望得到修复。
【解决方案2】:

快速修复。在 SDL_platform.h 中注释掉第 121 到 132 行 发生错误时文件加载到 C::B 中。保存并构建!

【讨论】:

    【解决方案3】:

    我遇到了这个问题。去

    C:\Program Files (x86)\Windows Kits\8.0\Include\shared
    

    找到winapifamily.h,然后复制到你的

    ..\Mingw\Include\ folder
    

    编辑:我想我有 Windows 工具包文件,因为 Visual Studio 2012 或更高版本,抱歉。很高兴你能解决你的问题。

    是的,问题出在该标题中(SDL_plataform.h 版本 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。
    • 就在我发布这个问题之后(在撰写本文时 2 小时前),正如进一步的谷歌搜索所揭示的那样,它在其他地方得到了回答。这个 SDL_platform.h 的替换为我解决了这个问题:marshut.com/irzuki/sdl-platform-h.html
    • 以上链接失效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 2012-11-04
    • 2011-10-14
    • 1970-01-01
    • 2018-03-05
    相关资源
    最近更新 更多