Linux 上没有控制台应用程序

Posted

技术标签:

【中文标题】Linux 上没有控制台应用程序【英文标题】:No console application on Linux 【发布时间】:2020-07-12 21:26:21 【问题描述】:

在 Windows 上,我通常会创建一个 Windows 桌面应用程序,这是因为控制台应用程序会在屏幕上显示一个简短的黑框。

我在 Linux Mint 上使用 CodeBlocks,但在 Linux 上,我怎么能做与上述相同的操作?

我不想在显示终端窗口后隐藏它。

【问题讨论】:

在 Linux 上没有这样的“控制台应用程序”,因为应用程序不会(在大多数情况下)为自己打开控制台窗口。不存在导致任何此类事情发生的通用应用程序属性。 很多应用程序希望将其标准流用于其主要 UI,但这与在任何屏幕上显示任何类型的窗口无关。事实上恰恰相反。 我想你只是想从终端运行你的程序。 @JohnBollinger 我认为他看到的是在 Linux 的窗口系统中双击“vanilla”C++ 可执行文件......通常会打开一个控制台窗口......这非常相似双击 Windows 中的“控制台”应用程序。 QT 有某种魔法可以防止控制台窗口打开 IIRC。 在 Linux 上,您可以通过 GUI 启动,在这种情况下不应该有任何类型的控制台窗口,或者您从控制台本身启动,在这种情况下可以有一些直接的控制台输出在用户选择的shell和终端程序中 @tadman 因此,如果我执行 ./myProgram 或双击该文件,如何确保屏幕上没有任何内容,无论是终端还是 GUI? 【参考方案1】:

Linux 没有与 windows 相同的“subsystem”概念:控制台和桌面应用程序之间没有区别或分离。当你在 Linux 上启动一个应用程序时,它不会打开控制台窗口,除非程序员明确地编程让它打开一个。

如果应用程序向stdoutstderr 写入任何内容,会发生什么取决于应用程序究竟是如何启动的。默认情况下,应用程序继承其父进程的stdoutstderr。如果应用程序是从终端启动的,则输出将在终端上可见。如果应用程序是由桌面环境从菜单项启动的,则输出可能会进入日志文件,否则可能会丢失。

如果您在从 IDE 运行程序时看到一个终端窗口打开,那是 IDE 正在为您做的事情,而不是您的应用程序。如果它困扰您,我认为 IDE 有办法在设置中禁用此行为。

【讨论】:

不仅仅是 IDE.... 这也发生在 Gnome、KDE ​​等中。 站点注释:如果 Linux 应用程序确实以某种方式打开了一个终端窗口,那将会非常奇怪和烦人。 @JoelFan 你是什么意思?如果单击 Gnome/KDE 系统菜单项会在终端仿真器中打开应用程序,这是因为该菜单项被配置为打开终端仿真器。这由 .desktop 文件中的Terminal 设置控制specifications.freedesktop.org/desktop-entry-spec/… @Joni,我说的是直接双击可执行文件【参考方案2】:

研究 QT。它是一个适用于 Linux 的 GUI 框架。

您可以在不创建主窗口的情况下编写代码(或者您可能必须有一个主窗口,但它总是可以隐藏......我已经有一段时间没有使用它了)。

但请注意,您可能会遇到此类设计的可用性问题...用户无法知道您的应用是否已启动或是否成功、何时完成等。

【讨论】:

【参考方案3】:

简单的方法是使用(例如)xterm [或gnome-terminal] 来获取终端窗口。

然后,从 shell [手动] 调用您的程序:

/path_to_my_program

您可以配置代码块来为您执行此操作。

或者,您可以添加一些保持默认窗口打开的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main()


    pid_t pid = fork();

    if (pid != 0) 
        waitpid(pid,NULL,0);
        while (1) sleep(1);
    

    long double n;
    n=5;
    printf("n= %Lf\n",n);

    return 0;


更新:

可以从以下位置控制调用命令:Settings -&gt; Environment -&gt; General Settings

默认是在xterm 子窗口[弹出] 中调用。您可以更改设置以(重新)使用现有的 [终端] 窗口。

请注意 [a codeblocks program] cb_console_runner 被使用。你可以用你喜欢的东西来代替它。

我不想要 GUI 也不想要终端弹出...

你需要一些类的终端来运行命令。这个可能是一个脚本,可以适当地转移stdin/stdout/stderr [并禁止调用sub-window],所以你必须尝试一下。

正如我上面提到的,您可以在代码块之外打开一个终端窗口,然后在其中手动运行命令。从技术上讲,这不是一个弹出窗口。但是,您会丢失 [自动] 调试器调用。

【讨论】:

以上是关于Linux 上没有控制台应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有控制台的 Windows 上运行 D-Bus?

代号 One 控制中心无法在 Linux 操作系统 (Ubuntu) 上运行

Linux 上的单实例 dotnetcore cli 应用程序

防止 .Net Core 5 控制台应用程序在 Linux 作为服务上运行时结束的推荐方法

QT4 Linux GUI应用程序如何把所需要的QT库一起打包,使其能在没有装QT4的Linux平台上运行??

在 Linux 上直接控制 HCI 设备(绕过蓝牙驱动程序)