编译提示SDL2/SDL.h未找到,按教程安装后仍无法解决
解决编译时“SDL2/SDL.h未找到”的问题
我正在跟着YouTube教程学习SDL2游戏开发,已经按照教程里的安装视频完成了SDL2的安装,但编译代码时一直碰到SDL2/SDL.h未找到的错误。下面是我的代码文件:
MAIN.CPP
#include "Game.hpp" Game *game =nullptr; int main(int argc, const char * argv[]) { game = new Game(); game->init("Nijigen-Engine", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, false); while (game->running()) { game->handleEvents(); game->update(); game->render(); } game->clean(); return 0; }
Game.cpp
#include "Game.hpp" Game::Game() {} Game::~Game() {} void Game::init(const char *title, int xpos, int ypos, int width, int height, bool fullscreen) { int flags = 0; if(fullscreen) { flags = SDL_WINDOW_FULLSCREEN; } if(SDL_Init(SDL_INIT_EVERYTHING) == 0) { std::cout << "Subsystems Initiated!..." << std::endl; window = SDL_CreateWindow(title, xpos, ypos, width, height, flags); if(window) { std::cout << "Window Created!..." << std::endl; } renderer = SDL_CreateRenderer(window, -1, 0); if(renderer) { SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); std::cout << "Renderer Created!..." << std::endl; } isRunning = true; } else { isRunning = false; } } void Game::handleEvents() { SDL_Event event; SDL_PollEvent(&event); switch (event.type) { case SDL_QUIT: isRunning = false; break; default: break; } } void Game::update() {} void Game::render() { SDL_RenderClear(renderer); SDL_RenderPresent(renderer); } void Game::clean() { SDL_DestroyWindow(window); SDL_DestroyRenderer(renderer); SDL_Quit(); std::cout << "Game Cleaned" << std::endl; }
Game.hpp
#ifndef Game_hpp #define Game_hpp #include "SDL2/SDL.h" #include <iostream> class Game { public: Game(); ~Game(); void init(const char* title, int xpos, int ypos, int width, int height, bool fullscreen); void handleEvents(); void update(); void render(); void clean(); bool running() { return isRunning; } private: bool isRunning; SDL_Window *window; SDL_Renderer *renderer; }; #endif /* Game_hpp */
针对这个问题,我整理了几个实用的解决方向:
确保编译器能定位SDL2头文件
编译器需要明确知道SDL2头文件的位置。如果你用gcc或clang编译,直接在命令里加-I参数指定头文件目录,比如Linux下常见路径:g++ main.cpp Game.cpp -o game -I/usr/include/SDL2 -lSDL2要是在Windows,假设SDL2安装在
C:\SDL2,编译命令要改成:g++ main.cpp Game.cpp -o game -IC:\SDL2\include -LC:\SDL2\lib -lSDL2main -lSDL2用
sdl2-config自动获取编译参数(Linux/macOS)
多数系统安装SDL2后会自带sdl2-config工具,它能直接输出正确的编译和链接参数,直接用这个命令编译就不用手动记路径了:g++ main.cpp Game.cpp -o game $(sdl2-config --cflags --libs)检查IDE的项目配置
如果你用VSCode、CLion这类IDE开发,一定要在项目配置里添加SDL2的包含目录和链接库:- VSCode:在
.vscode/tasks.json的args数组里加上-I<SDL2头文件路径>和-lSDL2(Linux),或者对应Windows的路径和库名; - CLion:在
File > Settings > Build, Execution, Deployment > CMake的CMake options里添加-DSDL2_INCLUDE_DIR=<路径>和-DSDL2_LIBRARY=<库文件路径>; - Visual Studio:右键项目→属性→VC++目录,添加包含目录和库目录,再在链接器→输入里添加
SDL2.lib和SDL2main.lib。
- VSCode:在
确认SDL2的安装结构
有时候安装后,SDL2的头文件可能不在SDL2/子目录下(比如直接放在include/里),这时候要么把代码里的#include "SDL2/SDL.h"改成#include "SDL.h",要么调整编译时的包含路径。
内容的提问来源于stack exchange,提问作者Dayskie
相关产品推荐
相关产品推荐

