为什么单击可执行文件后我的可执行文件不执行?


3

为什么似乎我无法通过双击打开在C ++上创建的可执行文件。

我有一个从IDE运行的文件,我想知道是否有一种方法可以像单击Windows上的.exe文件一样,单击该文件时将其打开。

可能性:

  • 我可以将C ++代码添加到源代码中,以允许这样做。

  • 配置“我的电脑”以将其打开。

我正在尝试尽可能避免使用工具箱,最近我在Windows上编译了一个应用程序(感谢堂兄,他有一台装有Windows的PC)

如果能够在Linux上的Windows上执行相同的操作,那将是很棒的,因为我们有2个Release文件夹。

而且我希望这个简单的基于Terminal的应用程序可以不必成为专家就可以运行。


我添加了这一行:

系统(“侏儒端”);

它在终端上打开,但仅显示文件路径而不是实际程序有什么建议?


@Leandro而不是添加“答案”来添加详细信息或回复受访者,请编辑问题(以添加详细信息),或使用“添加评论”(以回复他人等)
Marc Gravell

Answers:


6

我希望您需要在Linux C ++编译器输出的文件上设置“可执行”位,出于安全原因,我认为默认情况下不会这样做。

只需“ cd”到生成的可执行文件所在的目录即可

chmod +x myexecutable

用编译器输出的名称替换“ myexecutable”。

然后尝试使用./myexecutable运行它

我相信这也应该使该程序可以通过鼠标单击以及通过控制台“运行”。

同样,如果您需要运行命令的“脚本”,则可以在脚本文件中尝试以下操作,将其另存为“ myexe.sh”或类似的文件:

#!/bin/sh
command1
command2

然后再次使用

chmod +x myexe.sh 

创建它,以便您可以通过单击运行脚本。


@Leandro我已经编辑了答案以明确说明,您应该可以使用简单的脚本在终端中运行程序
Mokubai

包装脚本仅仅是多余的
谎言瑞恩

@LieRyan我根本不确定Linux是否会自动为非gui可执行文件打开终端,然后将其放入其中以确保...
Mokubai

好吧,我将文件扩展名更改为sh并开始工作
Leandro

@Mokubai,您需要使用终端应用程序来执行此操作。@Leandro这是因为将窗口管理器/文件管理器配置为在终端内运行Shell脚本。从某种意义上说,这种依赖行为并不是最合适的处事方式……
bubu

3

我认为问题的根源在于您并不真正了解终端仿真器和Shell之间的区别以及Linux如何弄清楚如何启动进程。

首先,有一个“终端仿真器”,在基于Gnome的环境中,通常是Gnome终端。

然后是“ Shell”,在Linux中通常是bash,尽管也可以使用其他shell。

“外壳”在“终端仿真器”中运行。这种区别来自物理终端的时代,在物理终端中,物理终端是用于接受输入,以彩色文字书写的硬件等,而Shell是用于处理用户命令并基于给定命令管理其他进程的软件。

如今,我们有一个可以显示任何图像的通用屏幕,因此我们不再使用物理终端,而是使用了“ Terminal Emulators”(一种可模拟物理终端的工作的软件)和Shell(仍然是与以前相同的ole'shell(嗯,现代shell确实利用了在软件终端仿真器中的优势,例如不受纸张的物理限制等,但仍然存在鸿沟)。

“外壳”并不总是在终端仿真器中运行;还有图形外壳,例如Nautilus(提示,Nautilus是具有大外壳的海洋生物的名称)或Windows Explorer(不要与Internet Explorer混淆)。

在命令行外壳(例如bash)和图形外壳(例如Nautilus)中,可执行文件都通过设置其execute位来进行标记。

在命令行外壳中,您可以ls -l用来查看文件的权限位,例如rwxrwxrwx意味着每个人都可以读取/写入/执行程序;rwxr-xr-表示所有者具有完全许可权,文件组中的人员可以读取和执行但不能写入,而其他人只能读取文件。在Nautilus中,您可以右键单击文件>属性>权限选项卡。在“权限属性”页面中,您可以类似于命令行外壳中的文件权限。

设置了执行位的文件被视为可执行文件,可以通过执行./filename(命令行外壳)或双击(图形外壳)来执行。

最后,关于Shell执行文件的方式还有其他一些微妙之处。在大多数Linux Shell中,您可以“执行”以python / perl / php / bash编写的脚本,该脚本不是已编译的可执行文件。由于这些文件不是本地编译的可执行文件,因此需要执行解释器(例如python解释器)。与Windows shell(Explorer)不同,Windows shell通过文件扩展名找出解释器来调用;Linux shell通过查看如下所示的“ hashbang”行找出正确的解释器

#!/usr/bin/python

当设置了文件的执行位并且文件具有此hashbang行时,shell将使用当前文件作为参数调用解释器/ usr / bin / python。

Nautilus还可以识别程序何时是命令行应用程序,并为您提供在终端中运行该应用程序的功能。双击可执行脚本时,Nautilus会询问您是否要在终端中运行它,不使用终端运行还是要在文本编辑器中编辑文件。


1

制作脚本以在xterm或其他内容中执行该脚本。在结束之前,请确保您的程序确实与用户进行了交互。(在xterm中运行它是否起作用?在典型的bash shell中运行它是否起作用?)

xterm -e命令 [args1 args2]

您能给我一些更多的信息吗
Leandro

由bash,那么你的意思是终端...对不起我不是很熟悉的bash我只是用它一次上色promtp
林德罗-

在文本模式linux下,您具有的命令提示符是shell。最常见的是bash。在极少数情况下,默认shell也可能是tcsh或zsh,但这仍然很少。在X中,您需要一个程序来提供包含文本的窗口,因此终端窗口通常是例如运行bash的gnome终端。
bubu

1

简单来说:

  1. 您生成的可执行二进制文件可能缺少可执行位。基于Unix的系统出于安全原因使用此功能。设置为:chmod +x yourbinary
  2. 该二进制文件实际上可以执行,但是由于linux不运行终端仿真器(有点像您和的接口stdout)来默认运行它,因此您什么也看不到。

对于后一种情况,您可以:

  1. 创建一个脚本,该脚本通过终端仿真器运行您的可执行文件,例如:

    exo-open --launch TerminalEmulator -e 'yourbinary'
    

    要在默认终端(如果有此exo命令)上运行它,或显式使用它。

  2. 创建一个desktop文件来运行它。

  3. 给它们一个自定义的特殊扩展名,.exec然后配置它们以使用文件扩展名设置上建议1(或类似名称)上的命令运行(如果您的操作系统支持该功能)。


0

如果您已经在Windows上编译了它,并且它是一个exe,则我看不到双击可执行文件时为什么终端不应该在Windows上打开的原因。您确定代码不会关闭(segfault等)吗?确保该程序不会崩溃是一个好主意。


Windows上运行良好的一个是Linux上编译的,我可以找到一种打开它的方式,就好像它是Windows .exe在其各自的OS上一样
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.