在编译Win32应用程序时,fprintf(stdout/stderr)在Visual Studio中打印到哪里?我一直听到它输出但我看不到它!
什么是在c ++中没有控制台窗口的情况下打印到输出日志的标准方法?
dre*_*rjm 14
如果您的程序与/ SUBSYSTEM:WINDOWS链接,除非您分配控制台,否则您将看不到控制台输出.
这是分配控制台选项的代码.使用此方法,您不需要乱用链接器设置或创建WinMain.
static void OpenConsole()
{
int outHandle, errHandle, inHandle;
FILE *outFile, *errFile, *inFile;
AllocConsole();
CONSOLE_SCREEN_BUFFER_INFO coninfo;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
coninfo.dwSize.Y = 9999;
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);
outHandle = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
errHandle = _open_osfhandle((long)GetStdHandle(STD_ERROR_HANDLE),_O_TEXT);
inHandle = _open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE),_O_TEXT );
outFile = _fdopen(outHandle, "w" );
errFile = _fdopen(errHandle, "w");
inFile = _fdopen(inHandle, "r");
*stdout = *outFile;
*stderr = *errFile;
*stdin = *inFile;
setvbuf( stdout, NULL, _IONBF, 0 );
setvbuf( stderr, NULL, _IONBF, 0 );
setvbuf( stdin, NULL, _IONBF, 0 );
std::ios::sync_with_stdio();
}
Run Code Online (Sandbox Code Playgroud)
如果您不想直接分配控制台,还可以通过更改链接器设置的子系统将子系统从/ SUBSYSTEM:windows更改为/ SUBSYSTEM:CONSOLE.请记住,当启用/ SUBSYSTEM:CONSOLE时,gui仍然会像以前一样工作,但是windows会为您和应用程序创建一个控制台窗口.
在我的Qt代码中,只需要它.但是,当我在VisualStudio中尝试使用MFC并通过链接器设置将子系统设置为控制台时.我收到以下错误:
1>------ Build started: Project: MFCApplication1, Configuration: Debug Win32 ------
1> MFCApplication1.cpp
1>msvcrtd.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
1>X:\Test\VC.110\MFCTest\MFCApplication1\Debug\MFCApplication1.exe : fatal error LNK1120: 1 unresolved externals
Run Code Online (Sandbox Code Playgroud)
这是由入口点默认为控制台应用程序中的main()和Windows应用程序中的WinMain引起的.要解决此问题,我必须将以下内容添加到高级链接器设置的入口点设置:"wWinMainCRTStartup"
Ben Voigt在评论中提出了另一种方法.使用editbin更改子系统不需要更改入口点.确实如此.当子系统构建测试应用程序然后使用editbin使用以下命令更改子系统时,我删除了入口点并放回窗口:
X:\Test\VC.110\MFCTest\MFCApplication1\Debug>editbin MFCApplication1.exe /SUBSYSTEM:CONSOLE
Microsoft (R) COFF/PE Editor Version 10.00.40219.01
Copyright (C) Microsoft Corporation. All rights reserved.
Run Code Online (Sandbox Code Playgroud)
我得到了我在控制台中预期的输出:
X:\Test\VC.110\MFCTest\MFCApplication1\Debug>MFCApplication1.exe
Hello from a windows application!
Run Code Online (Sandbox Code Playgroud)
注意:使用editbin方法,每次更新可执行文件时都需要重命名.
一旦你有控制台printf或std :: cout将工作,最后在任何一种方法.例如,在我的测试MFC应用程序中,我将以下行添加到CMFCApplication1App类的构造函数中:
std::cout << "Hello from a windows application!" << std::endl;
Run Code Online (Sandbox Code Playgroud)