用 c 编写的程序在 windows 中双击运行,但不在 linux 中运行

vol*_*mot 3 gui terminal executable

我在OS,Linux(Ubuntu和CentOS)和Windows 7上用相同的源代码用C语言做了一个简单的加法程序,如下:

#include <stdio.h>
int main(){
int a,s,d;

printf("type the values u want to add and give tab between them\n");

scanf("%d %d",&a,&s);

d=a+s;

printf("addition is %d",d);

return 0;

system("read -p 'Press Enter to EXIT...' var");
}
Run Code Online (Sandbox Code Playgroud)

在 Windows 中,它在我双击时运行,addition.exe但在 Ubuntu(也在 CentOS)中,当我单击可执行文件时addition,什么也没有发生。它不会运行或打开终端。但是,当我输入./addition终端时它会运行。

但我想通过双击它来运行它。我该怎么办?

该文件的属性在此图像中:

“添加”可执行文件的属性

在属性的打开部分中​​也没有像“在终端中打开”这样的选项。

我也尝试创建.desktop如下文件:

[Desktop Entry]
Name=addition
Type=Application
Exec=/media/smit/D/smits programs of c/projects by code blocks/02U/addition/bin/Debug/addition
Terminal=true
Run Code Online (Sandbox Code Playgroud)

当我点击addition.desktop然后它说启动应用程序时发生错误。

我还尝试通过将此桌面文件复制到/usr/share/applications.

Ser*_*nyy 9

问题的核心是您正在尝试运行程序,它是控制台应用程序,但您没有附加终端。在终端中,您可以通过调用程序名称来运行您的程序,但在 GUI 中,您需要明确指定应该有一个终端窗口来运行控制台应用程序(这对于基于 GNOME 的桌面尤其如此,例如 Ubuntu 的 Unity) .

应该做的是,您还需要.desktop为您的程序创建一个包含 4 个字段的文件。下面是一个例子:

[Desktop Entry]
Name=MyProg
Type=Application
Exec=/home/xieerqi/example_directory/hello_world_prog
Terminal=true
Run Code Online (Sandbox Code Playgroud)

我不了解 CentOS,但就 Ubuntu 而言,如果.desktop应用程序位于用户主目录下的任何目录中,则要求应用程序也必须是可执行.desktop位于其他目录中的文件,例如/usr/share/applications不需要。

因此,一旦您拥有该.desktop文件并使其可执行,您就可以运行该程序。重要的一点是Terminal=true线。这就是告诉 GUI 启动终端并在那里运行您的程序的原因。注意:如果您的程序执行内容并立即退出,您将需要某种延迟或getchar(); 调用以保持窗口打开,因为程序退出时终端窗口将退出。这就是为什么许多用户有时会感到困惑“为什么我的程序没有运行?” 它运行,实际上,它只是退出太快了。


附加说明

  • 摆脱system("read -p 'Press Enter to EXIT...' var");. 该read调用是一个内置的外壳程序,而不是一个独立的程序,这意味着它只有在您使用外壳程序时才能使用,例如bash. 如果您使用的是 C,请正确使用scanf()getchar()为您的程序添加延迟。它出现在return 0;line之后,这意味着system()不会到达您的line(程序将在return语句处退出),因此您为程序放置的暂停也是无效的。
  • 阅读AskUbuntu 上的这篇文章,例如.desktop带有官方文档链接的正确文件。
  • 如果你感觉懒惰,不想让.desktop文件为每一个可执行文件,有很多的解决方案在这里。我什至在那里发布了一个脚本。