Windows下CLion使用SDL2编译运行无控制台输出,调试时正常
解决CLion+SDL2在Windows下运行无控制台输出的问题
嘿,我之前也碰到过一模一样的问题!这种情况大多和Windows下的程序子系统配置以及CLion的运行行为有关,给你几个靠谱的解决思路:
1. 调整CMakeLists.txt的程序子系统设置
SDL2项目默认会被配置成GUI子系统(也就是Windows窗口程序),这种程序在运行时不会自动分配控制台窗口,所以你在CLion的内置控制台看不到输出。而调试模式下CLion会强制捕获程序的输出流,所以能正常显示。
修改你的CMakeLists.txt,在add_executable之后添加以下配置,明确指定使用控制台子系统:
add_executable(YourProjectName main.cpp ...) # 添加这两行,把程序改为控制台子系统 set_target_properties(YourProjectName PROPERTIES WIN32_EXECUTABLE FALSE )
如果你的CMakeLists里之前写了WIN32(比如add_executable(YourProjectName WIN32 main.cpp)),记得把那个WIN32去掉——它就是用来指定GUI子系统的关键标记。
2. 开启CLion的外部终端运行
如果不想改变程序的子系统(比如你需要保持SDL窗口作为主界面,同时看控制台输出),可以修改CLion的运行配置:
- 点击顶部工具栏的运行配置下拉框,选择
Edit Configurations... - 在打开的窗口里,找到你的项目配置,切换到
Execution标签页 - 勾选
Run in external terminal选项
这样运行程序时会弹出系统自带的控制台窗口,你的printf或cout输出就会显示在这里了。
3. 代码层面手动创建控制台
如果上面两种方法都不适用,还可以在代码里手动分配控制台并重定向输出流,这种方法最灵活:
#include <SDL.h> #ifdef _WIN32 #include <windows.h> #include <cstdio> #endif int main(int argc, char* argv[]) { // Windows下手动创建控制台 #ifdef _WIN32 AllocConsole(); // 把stdout重定向到控制台 freopen("CONOUT$", "w", stdout); // 如果需要stderr也显示,再加一行:freopen("CONOUT$", "w", stderr); #endif // 你的SDL初始化和业务代码 SDL_Init(SDL_INIT_VIDEO); // ... SDL_Quit(); return 0; }
这样不管是直接运行还是调试,都会弹出一个控制台窗口,所有标准输出内容都会显示在这里。
这几个方法应该能解决你的问题,我当时是用第一种方法搞定的,你可以挨个试试!
内容的提问来源于stack exchange,提问作者Jochem Kuijpers




