Windows平台下使用CMake运行SDL2HelloWorld程序无响应求助
程序运行无反应:既不弹出窗口也无cout输出
问题描述
编译运行程序后完全没有反应,既不弹出SDL窗口,连最开始的cout输出都看不到。
相关文件
./src/main.cpp
#include <SDL2/SDL.h> #include <iostream> #define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 480 int main(int argc, char* args[]) { std::cout << "Le programme se lance"; // 至少应该输出这句话 SDL_Window* window = NULL; SDL_Surface* screenSurface = NULL; if (SDL_Init(SDL_INIT_VIDEO) < 0) { std::cout << "could not initialize sdl2 :" << SDL_GetError() << std::endl; return 1; } window = SDL_CreateWindow( "hello_sdl2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN ); if (window == NULL) { std::cout << "could not create window:" << SDL_GetError() << std::endl; return 1; } screenSurface = SDL_GetWindowSurface(window); SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 0xFF, 0xFF, 0xFF)); SDL_UpdateWindowSurface(window); SDL_Delay(10000); SDL_DestroyWindow(window); SDL_Quit(); return 0; }
./CMakeLists.txt
cmake_minimum_required(VERSION 3.25.1) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True) project("Test") set(SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}") set(SDL2_DIR "${SRC_DIR}/lib/cmake/SDL2") find_package(SDL2 REQUIRED) include_directories(${SDL2_INCLUDE_DIRS}) add_executable(MAIN "${SRC_DIR}/src/main.cpp") target_link_libraries(MAIN ${SDL2_LIBRARIES})
项目架构

所有SDL相关文件来自SDL2-devel-2.26.1-mingw压缩包。
执行命令
cd ./build/ cmake .. -G "MinGW Makefiles" make ./MAIN.exe
运行结果

解决方法
强制刷新标准输出
你的cout语句没有换行符,标准输出默认行缓冲模式,内容会留在缓冲区无法立即打印。把第一行输出改成:std::cout << "Le programme se lance" << std::endl;或者手动刷新缓冲区:
std::cout << "Le programme se lance"; std::cout.flush();补充SDL运行时依赖
MinGW编译的程序需要对应SDL2运行时动态库SDL2.dll才能启动。从SDL压缩包的bin目录下复制SDL2.dll到MAIN.exe所在的build目录,否则程序会因找不到依赖直接静默退出。验证依赖链接情况
在MinGW环境下用ldd MAIN.exe命令检查程序依赖是否全部能找到,若有缺失及时补充对应库文件。开启SDL日志排查初始化问题
在SDL_Init前添加日志级别设置,方便定位初始化阶段的错误:SDL_SetHint(SDL_HINT_LOG_LEVEL, "verbose");
内容的提问来源于stack exchange,提问作者Reilbas
相关产品推荐
相关产品推荐

