SDL_ttf 找不到“SDL.h”,但 main.cpp 可以

Posted

技术标签:

【中文标题】SDL_ttf 找不到“SDL.h”,但 main.cpp 可以【英文标题】:SDL_ttf cannot find "SDL.h", but main.cpp can 【发布时间】:2013-12-30 21:13:01 【问题描述】:

我正在编写一个 make 文件来编译一个非常简单的 SDL2 程序。

到目前为止,它可以很好地编译 SDL2,现在我正在编译扩展框架 SDL2_image 和 SDL_ttf。

MAKE 似乎可以正确找到 SDL_ttf.h,但随后 SDL_ttf.h 无法找到“SDL2/SDL.h”。

这是错误:

In file included from main.cpp:3:
/Library/Frameworks/SDL2_ttf.framework/Headers/SDL_ttf.h:30:10: fatal error:
  'SDL2/SDL.h' file not found
#include <SDL2/SDL.h>
         ^
1 error generated.
make: *** [main.o] Error 1

注意,当我像这样包含 SDL2 时:

#include <SDL2/SDL.h>

我什至无法编译一个基本程序(没有扩展的 SDL2)。我通过将其更改为:

#include "SDL.h"

(我还听说后一种语法更适合可移植性?)

有什么想法吗?

我在 OS X Mavericks 上这样做

这是我的文件: main.cpp

#include <iostream>
#include "SDL.h"
#include "SDL_ttf.h"
#include "SDL_image.h"

int main(int argc, char * arg[])

    if(SDL_Init(SDL_INIT_EVERYTHING) != 0)
    
         std::cout << "ERROR" <<std::endl;

        return -1;
    

    SDL_Window * window = SDL_CreateWindow("Name", SDL_WINDOWPOS_CENTERED,
    SDL_WINDOWPOS_CENTERED,
    640,
    480,
    SDL_WINDOW_OPENGL);
     if (TTF_Init() == -1)
     
     sdl::cout << "SDL_ttf failed" << std::endl;
     

    SDL_Surface* tempSurface = IMG_Load("test.png");

    if (tempSurface == nullptr)
    
    std::cout << "failed to load test.png" << std::endl;
    

    SDL_FreeSurface(tempSurface);

    SDL_Delay(5999);

    SDL_DestroyWindow(window);

    SDL_Quit();

    return 0;

制作文件

CXX = clang++
SDL = -framework SDL2 -framework SDL2_ttf -framework SDL2_image

CXXFLAGS = -Wall -c -std=c++11 -I /Library/Frameworks/SDL2.framework/Headers -I       /Library/Frameworks/SDL2_ttf.framework/Headers -I    /Library/Frameworks/SDL2_image.framework/Header

LDFLAGS = $(SDL) -F /Library/Frameworks
EXE = test

all: $(EXE)

$(EXE): main.o
$(CXX) $(LDFLAGS) $< -o $@
main.o: main.cpp
$(CXX) $(CXXFLAGS) $< -o $@

clean:
    rm *.o && rm $(EXE)

编辑:

我已按照 DMG 文件中的说明将 SDL2 和 SDL2_ttf 安装到 /Library/Frameworks 文件夹中。

【问题讨论】:

【参考方案1】:

我相信您需要 SDL2_ttf 才能使用 SDL2。

SDL_ttf (2.0.11) 需要 SDL (1.2)

而 SDL2_ttf (2.0.12) 需要 SDL2

【讨论】:

感谢您的评论 LordAro,我相信我使用的是正确版本的 SDL2_ttf 和 SDL2【参考方案2】:

我已经通过 DMG 安装了 SDL2 库,这是使它们可用于 Xcode 的正确方法。

但是,我想使用 g++ 并通过 MAKE 编译,这导致了我上面详述的问题。

答案是安装 SDL2 和 UNIX 风格的扩展库,详见此处 http://www.ginkgobitter.org/sdl/?FAQMacOSX

然后我就可以像这样使用包含语句:

#include "SDL.h"
#include "SDL_ttf.h"
#include "SDL_image.h"

我的 makefile 现在看起来像这样(注意使用 sdl2-config 以及如何链接 TTF 和图像库):

CXX = clang++
SDL = `sdl2-config --libs`

CXXFLAGS = -Wall -c -std=c++11 `sdl2-config --cflags`
LDFLAGS = $(SDL) -lSDL2_ttf -lSDL2_image 
EXE = test

all: $(EXE)

$(EXE): main.o
    $(CXX) $(LDFLAGS) $< -o $@
main.o: main.cpp
    $(CXX) $(CXXFLAGS) $< -o $@

【讨论】:

以上是关于SDL_ttf 找不到“SDL.h”,但 main.cpp 可以的主要内容,如果未能解决你的问题,请参考以下文章

ios的SDL开发,找不到SDL_Overlay类和SDL_SetVideoMode函数,有替代方案么?

pip install pygame - 找不到 SDL.h 文件

用 SDL2 在屏幕上打印文本

SDL_Init_Everything 在 C 中失败

当SDL_init()时,FFmpeg2.3.3和SDL2-2.0.3的Android Media播放器出错。错误是关于SDL_main.h

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