背景:QT+CUDA开发,从QCreator转到VS,遇到了两个问题:
1. QT项目运行后只有UI界面,没有Console界面,无法输出调试信息
2. 调出Console界面后只能输出CUDA核函数的printf信息,其他位置的printf信息无法输出
原文地址:使用AllocConsole在Win32程序中调用控制台调试输出 - 慕Smile - 博客园
操作流程:
1. 打开控制台
2. 重定向输出流
3. 输出信息
代码:
AllocConsole();
freopen("CONOUT$", "w", stdout);
std::cout << "This is a test info" << std::endl;
相关函数说明:
AllocConsole函数的功能是为当前的窗口程序申请一个Console窗口,其原型为
BOOL AllocConsole(void);
函数调用成功,返回非零值,调用不成功则返回0。
freopen函数用来替换一个流,或者说重新分配文件指针,以实现重定向。可重定向的流有:标准输入流、标准输出流或者标准错误流。其函数原型为
FILE *freopen(const char *path, const char *mode, FILE *stream);
其中"CONOUT$"是指代当前console的特殊字符串,"w"表明以written模式打开这个console,stdout指代标准输出流。
比较神奇的是,在三台电脑上进行了测试,其中一台电脑不需要freopen就可以直接输出所有的printf信息,另外两台可以输出cuda核函数内的printf信息(需要cudaDeviceSyn函数),但无法输出核函数外的printf信息。
添加freopen函数后解决。
补充:
printf延迟输出的解决方案:
1.设置缓存区为0
setbuf(stdout, NULL);
2.刷新缓存区
fflush(stdout);