SDL/SDL_image.h:没有这个文件或目录。

42

我正在尝试跟随Lazy Foo's的教程,但是在运行他的例子时,出现了以下编译器错误:

error: SDL/SDL_image.h: 没有那个文件或目录

编译器/链接器已正确设置,我正在使用Windows XP上的Code::Blocks。

然而,问题很简单,就是没有SDL_image.h。我检查了它应该在的文件夹,但并没有找到。我尝试重新下载SDL库并再次检查,仍然找不到SDL_image.h文件。SDL_image.h文件去哪了?

我下载的库是来自此链接下Win32的“开发库”中的“SDL-devel-1.2.14-mingw32.tar.gz”:

http://www.libsdl.org/download-1.2.php


1
据我所知,包含与SDL相关的头文件的“官方”方式是通过 #include "SDL.h"。 - trenki
@trenki:通常在类Unix系统中,它位于“/usr/include/SDL”下。 - Sebastian Mach
2
@phresnel:我知道,这就是为什么sdl-config --cflags --libs包含-I/usr/include/SDL的原因。 - trenki
8个回答

63
你需要单独安装 SDL_image。它不随 SDL 一起发货。

3
对于正在使用SDL2的人来说,文件名已更改为“SDL2_image.h”。请参阅文档:http://wiki.libsdl.org/MigrationGuide#line-435 - Bit Fracture
3
在我的电脑上,该文件位于/usr/local/include/SDL2/SDL_image.h。基本上需要从"SDL2/SDL_image.h"中导入并使用-lSDL_image链接。 - alok
@BitFracture 可能取决于情况,对我来说仍然是 SDL_image.h,确切地说是SDL2/SDL_image.h - Hi-Angel
@Hi-Angel 这里的重要点是,对于每个人来说它可能不在同一个位置。希望了解这一点能够避免一些尴尬的情况。 - Bit Fracture
1
在 macOS 上,您可以通过 brew install sdl2 sdl2_image 来获取此内容,至少在构建 Brogue CE 时是这样的。 - Phoenix

12

如果你使用的是基于Debian的系统,你需要像其他答案中提到的那样安装SDL_image库。你可以使用以下命令轻松安装:

你需要安装SDL_image库,就像其他答案中提到的一样。如果你使用基于 Debian 的系统,你可以通过以下命令轻松安装:

sudo apt-get install libsdl-image1.2-dev

3
在lazyfoo的第三个教程中完全解释了这一点。基本上,你必须在编译行中添加"-lSDL_image"。

3

如果您使用的是Windows系统,那么您应该首先安装sdl_image

#include <SDL_image.h>

#include <SDL/SDL_image.h>

如果您正在使用Linux,并且您的sdl-image软件包已安装到/usr/include/SDL,那么您需要使用:
#include <SDL_image.h>

在大多数情况下,当你在Linux上从源代码安装时,你的软件包可能不会位于/usr/include/SDL目录中。
在这种情况下,我会使用:
#include <SDL/SDL_image.h>

而且它有效


1
如果有人尝试这个,更新一下是要在编译行中实际添加“-lSDL2_image”。其他人只有“-lSDL_image”,这在SDL2发布时发生了变化。之后只需转到bin并将所有.dll文件添加到System32中,然后您就可以开始了!

0

你需要下载 "SDL_image-devel-1.2.4-VC6.zip"。 对于 Code Blocks,下载链接 » http://www.libsdl.org/projects/SDL_image/release/SDL_image-devel-1.2.4-VC6.zip 将解压后在 zip 文件中找到的 include 文件夹中的文件复制并粘贴到 C:\SDL\include\SDL,在我的情况下或您其他 SDL *.h 文件所在的目录。

同样地,复制 zip 文件的 lib 文件夹中的文件并将其粘贴到 C:\SDL\lib 或其他 lib 文件所在的文件夹中。 然后将存档中所有的 *.dll 文件都复制到 C:\windows\system32 中。 接下来,您需要通过打开设置 > 编译器和调试器 > 链接器,并将 "-lSDL_image" 添加到编译行中。
然后打开一个空文件项目并将空文件添加到项目中,然后 #include "SDL\SDL_image.h"。 希望这对您有用!!

或者

首先从上面给出的链接下载SDL_image-devel-1.2.4-VC6.zip,然后访问链接 >> http://www.lazyfoo.net/SDL_tutorials/lesson03/windows/codeblocks/index.php 以获取更详细的说明。


0

SDL库是模块化的,当您获取该库时,默认情况下只分发核心部分。对于SDL 1,这包括SDL本身和(为那些编写SDL应用程序的人)SDL-devel;对于SDL 2,库是SDL2和SDL2-devel。开发人员应用程序中相应的包含文件是<SDL/SDL.h>和<SDL2/SDL.h>,当获取和安装*-devel库时,包含文件已经安装在系统标准位置。

所有模块都遵循类似的模式,SDL_X,SDL_X-devel用于SDL 1,SDL2_X和SDL2_X-devel用于SDL 2,对于模块X,相应的开发人员包含文件是<SDL/SDL_X.h>和<SDL2/SDL_X.h>。例如,对于图像模块,X = image,库是SDL_image,SDL_image-devel,SDL2_image,SDL2_image-devel,包含文件是<SDL/SDL_image.h>和<SDL2/SDL_image.h>。

这些模块包括:"image"(如上所述)用于处理不同标准格式(例如PNG)的图像;"mixer",用于处理不同的音频文件格式;"gfx",用于图形绘制基元;"net",用于网络应用程序;"rtf",用于Rich Text Format;"ttf",用于字体处理(ttf代表"TrueTypeFont")。
SDL的源代码在这里:

https://github.com/orgs/libsdl-org/repositories?type=all


0

以下是我使用的适用于32位Windows操作系统的SDL2设置(C语言):

  1. 从这里下载 SDL2_image-devel-2.0.5-mingw.tar.gzSDL2_image-2.0.5-win32-x86.zip(32位选择其他,64位):https://www.libsdl.org/projects/SDL_image/

  2. "SDL2_image-devel-2.0.5-mingw\SDL2_image-2.0.5\i686-w64-mingw32\include\SDL2\SDL_image.h" 复制到您的 SDL 文件夹中,其中包含所有头文件,在我的情况下是 "MinGW\include\SDL2"

  3. "SDL2_image-devel-2.0.5-mingw\SDL2_image-2.0.5\i686-w64-mingw32\bin" 的内容复制到 "\MinGW\bin"

  4. "SDL2_image-devel-2.0.5-mingw\SDL2_image-2.0.5\i686-w64-mingw32\lib" 的内容复制到 "MinGW\lib"

  5. 像这样包含头文件:

        #include <SDL2/SDL_image.h>
    
  6. 在您的 makefile 中链接它(请参见此处的 '... -llibSDL2_image ...'):

        build:
            gcc -Wfatal-errors \
            -std=c99 \
            ./*.c \
            -I"C:\libsdl\include" \
            -L"C:\libsdl\lib" \
            -lmingw32 \
            -lSDL2main \
            -lSDL2 \
            -lSDL2 \
            -llibSDL2_image \
            -o example.exe
  • 虚拟代码示例.c
  •      #include <SDL2/SDL.h>
         #include <SDL2/SDL_image.h>
         #include <SDL2/SDL_timer.h>
         #include <stdio.h>
        
        int main(int argc, char *args[])
        {
        
            // attempt to initialize graphics and timer system
            if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) != 0)
            {
                printf("Error initializing SDL: %s\n", SDL_GetError());
            }
        
            // Declare pointers
            SDL_Window *window;
            SDL_Renderer *renderer;
            SDL_Texture *bitmapTex = NULL;
            SDL_Surface *bitmapSurface = NULL;
        
            // Create an application window with the following settings:
            window = SDL_CreateWindow(
                "An SDL2 window",       // window title
                SDL_WINDOWPOS_CENTERED, // initial x position
                SDL_WINDOWPOS_CENTERED, // initial y position
                840,                    // width, in pixels
                480,                    // height, in pixels
                SDL_WINDOW_OPENGL       // flags - see below
            );
        
            // Check that the window was successfully created
            if (!window)
            {
                // In the case that the window could not be made...
                printf("Could not create window: %s\n", SDL_GetError());
                SDL_Quit();
                return 1;
            }
        
            // create renderer which sets up graphics hardware
            Uint32 render_flags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC;
            renderer = SDL_CreateRenderer(window, -1, render_flags);
            if (!renderer)
            {
                printf("error creating renderer: %s\n", SDL_GetError());
                SDL_DestroyWindow(window);
                SDL_Quit();
                return 1;
            }
        
            // Load theimage into memory using SDL_Image library function
            bitmapSurface = IMG_Load("image.png");
            bitmapTex = SDL_CreateTextureFromSurface(renderer, bitmapSurface);
        
            SDL_FreeSurface(bitmapSurface);
            if (!bitmapTex)
            {
                // In the case that the window could not be made...
                printf("Error creating texture: %s\n", SDL_GetError());
                SDL_DestroyRenderer(renderer);
                SDL_DestroyWindow(window);
                SDL_Quit();
                return 1;
            }
        
            // The window is open: could enter program loop here (see SDL_PollEvent())
            while (1)
            {
                SDL_Event e;
                if (SDL_PollEvent(&e))
                {
                    if (e.type == SDL_QUIT)
                    {
                        break;
                    }
                }
        
                // Clear the window
                SDL_RenderClear(renderer);
                SDL_RenderCopy(renderer, bitmapTex, NULL, NULL);
                SDL_RenderPresent(renderer);
            }
        
            SDL_DestroyTexture(bitmapTex);
            SDL_DestroyRenderer(renderer);
            SDL_DestroyWindow(window);
        
            SDL_Quit();
        
            return 0;
        }
    

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