【发布时间】:2012-05-19 21:23:05
【问题描述】:
我正在开发一个 C 和 C++ 应用程序,它使用一些图形引擎来处理 gtk 窗口 (Opencv/highgui)。这个应用程序对 stdout/cout 做了一些小的输出。
在 Windows 上,从桌面启动此类应用程序会自动打开一个控制台,通过“printf()”或“std::cout”向用户显示标准输出中写入的内容。
在 Linux 上,如果我从以前打开的控制台启动它,没有问题。但是如果我通过桌面启动它(双击),那么 linux 不会打开关联的控制台,并且在 stdout/cout 上写入的数据会丢失。 似乎这是 Linux 上的正常行为(?)。
我想在我的应用程序在 linux 平台上编译时自动打开控制台。
这似乎是this one 的欺骗,关键是,它不起作用!我目前有以下代码:
#ifndef __WIN32
filebuf* console = new filebuf();
console->open( "/dev/tty", ios::out );
if( !console->is_open() )
cerr << "Can't open console" << endl;
else
cout.ios::rdbuf(console);
#endif
(使用 freopen() 将 cerr 重定向到文件中)
我不断收到“无法打开控制台”。我尝试替换控制台名称:
console->open( "/dev/console", ios::out );
但这并没有改变。
我的方向正确吗?接下来我可以尝试什么?我应该尝试专门打开终端应用程序(xterm)吗?但是,我怎样才能将该控制台与我的应用程序“连接”呢?
【问题讨论】:
-
Hmm.. 我知道在某些桌面环境(至少是 GNOME)中,您可以在桌面上创建一个启动器(Windows 术语中的“快捷方式”),并指定从它启动的应用程序是与关联的终端一起运行。如果你想尝试,创建一个新的启动器,然后检查它的属性 - 你会在那里找到选项。不知道这是否是你想要的。
-
@kebs 如果您在图形环境(如 gnome 终端)下的终端中运行您的应用程序,您将能够看到终端的输出和应用程序打开的窗口。
-
@fullhack:是的,我知道,但在这种情况下它不是一个选项。
-
@ShinTakezou:当然,但问题是关于当不从终端启动应用程序时有终端。
-
我的看法是,通过终端提供有意义信息的应用程序,必须从终端执行...