VC++中使用printf/std::cout无法输出到控制台的问题求助
VS控制台输出失败+LNK2019错误的解决办法
你漏掉的关键原因
你的项目大概率是Windows桌面应用(比如Win32、MFC、WinForms),这类项目默认入口是WinMain或wWinMain,不是控制台程序的main。改成Console子系统后,编译器会强制找main函数,找不到就触发LNK2019错误——这是配置和入口函数不匹配导致的核心矛盾。
可行替代方案
方案1:强制创建控制台(不用改项目配置)
不想动项目设置的话,直接加几行代码手动生成控制台窗口,把printf/cout的输出重定向过去:
#include <Windows.h> // 在程序启动的地方调用这个函数 void SetupConsole() { AllocConsole(); FILE* out; freopen_s(&out, "CONOUT$", "w", stdout); freopen_s(&out, "CONOUT$", "w", stderr); }
调用后,原来的输出语句就能正常显示在弹出的控制台里,无需修改SubSystem配置。
方案2:彻底转为控制台项目
如果想长期用控制台输出,同步修改入口函数和项目配置:
- 把代码里的
WinMain/wWinMain换成标准main函数:int main() { printf("测试输出\n"); std::cout << "cout输出测试" << std::endl; return 0; } - 检查并调整项目配置:
- 链接器→系统→子系统:选择
Console (/SUBSYSTEM:CONSOLE) - C/C++→高级→入口点:留空(让编译器自动识别
main作为入口)
- 链接器→系统→子系统:选择
方案3:用调试输出替代控制台
不需要弹出控制台窗口的话,直接把内容输出到VS的调试窗口:
#include <Windows.h> // 宏定义简化调用 #define DEBUG_LOG(msg) OutputDebugStringA(msg) // 在WinMain里调用输出 int WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR cmd, int show) { DEBUG_LOG("调试日志内容\n"); // 若要输出cout内容,可额外重定向流,或直接用DEBUG_LOG封装字符串 return 0; }
然后打开VS的调试→Windows→输出窗口就能看到内容,完全不用修改子系统配置。
额外排查点
- 确认项目类型是应用程序(.exe),如果是静态库/动态库,修改子系统必然报错(右键项目→属性→常规→项目类型)。
- 检查是否设置了禁用标准库的宏(比如
_NO_STDIO_STREAMS),这会导致printf/cout功能失效。
内容的提问来源于stack exchange,提问作者Roshan Menon
相关产品推荐
相关产品推荐

