You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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选项

这样运行程序时会弹出系统自带的控制台窗口,你的printfcout输出就会显示在这里了。

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

火山引擎 最新活动