我正在编写一个 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 上执行此操作
这是我的文件: 主.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 文件夹中。
我相信您需要 SDL2_ttf 才能与 SDL2 一起使用。
SDL_ttf (2.0.11) 需要 SDL (1.2)
并且 SDL2_ttf (2.0.12) 需要 SDL2
我已通过 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”而不是像我在主文件中所做的那样。如果不是从源代码安装和构建并通过自制软件安装,这就是问题所在。
-I/opt/homebrew/Cellar/sdl2/2.28.3/include/SDL2/
这样当项目运行时,SDL_ttf库可以从构建项目的根目录链接SDL.h。我的项目的 build.sh 文件是
#!/bin/bash
set -e
INCLUDES="-I/opt/homebrew/Cellar/sdl2/2.28.3/include/ -I/opt/homebrew/Cellar/sdl2/2.28.3/include/SDL2/ -I/opt/homebrew/Cellar/sdl2_ttf/2.20.2/include/"
LIBS="-L/opt/homebrew/Cellar/sdl2/2.28.3/lib/ -L/opt/homebrew/Cellar/sdl2_ttf/2.20.2/lib/ -lSDL2"
gcc -Wall -o main main.c ${INCLUDES} ${LIBS}