繁体   English   中英

无法从Nautilus运行可执行文件

[英]Can't run executables from nautilus

(显示的警告)在Ubuntu 18.04上,我使用g++ test.cpp -o test编译了一个仅包含stdio.h和一个空主函数的c ++示例。

没有错误弹出,从终端运行它也没有问题。

但是,一旦我继续使用nautilus并尝​​试通过单击test来运行它,就会弹出警告,要求我选择一个程序来打开共享库。

如何确保程序被编译为可执行文件/被文件管理器视为可执行文件?

编辑:可执行文件上的stat输出(重新编译并将其名称更改为asdff):

File: asdff
  Size: 10600       Blocks: 24         IO Block: 4096   regular file
Device: 808h/2056d  Inode: 4200517     Links: 1
Access: (0755/-rwxr-xr-x)  Uid: ( 1000/  miguel)   Gid: ( 1000/  miguel)
Access: 2018-05-18 15:22:58.009993285 +0100
Modify: 2018-05-18 15:22:58.009993285 +0100
Change: 2018-05-18 15:22:58.009993285 +0100
Birth: -

df output on the same executable:


Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/sda8      128206036 102694048  18956444  85% /

desktop entry:

[Desktop Entry]
Type=Application
Encoding=UTF-8
Name=asdff
Exec=./home/miguel/Desktop/asdff
Icon=/home/miguel/Desktop/index.png

我注意到您正在尝试使用桌面文件。 那很好。

因为Nautilus已打补丁,以删除执行程序的能力。 这是一个安全问题。

将桌面文件放置在应用程序启动器的正确位置,然后以这种方式打开它,而不是使用Nautilus。 我相信这个位置是$HOME/.local/share/applications

该答案假定您的test程序位于您的主文件夹中,并且/home具有自己的分区,带有noexec选项(这是Ubuntu的默认设置)。

man mount说:

noexec不允许直接在已挂载的文件系统上执行任何二进制文件。

这意味着您的系统阻止您在主文件夹上运行测试程序。

如果是这样,则可以将程序移至/home之外,也可以通过编辑/etc/fstab文件来更改安装主分区的方式。 参见man fstab ,但是基本上您想添加exec选项。


其他假设:

  1. 无论出于何种原因,您的test程序都没有执行权限。 使用$stat test
  2. 无论出于何种原因,您给测试程序指定的名称都可以通过系统的shell内置命令test推断。 重命名您的程序。

使用交互式shell命令行终端仿真器中运行程序。 注意PATH变量 (您可以通过配置交互式shell(例如,在~/.bashrc )来更改它)。 您的外壳将使用execve(2) (在globlob之后)运行可执行二进制文件(因此,它应保留在某个可执行分区上, 由YSC回答并可以执行-参见stat(2) )。 您想查看程序的stdoutstderr输出。 另请参阅答案。

g++与所有警告和调试信息一起使用,因此g++ -Wall -Wextra -g 避免命名test程序(该名称与test(1)冲突)。 如果可执行文件使用其他库,则可能需要在链接时显式显示一些rpath

仅当您的程序是GUI程序(例如,为Qt之类的小部件工具包编码)时,您才希望(最终)能够通过单击在桌面上运行它(详细信息可能特定于您的桌面环境 )。 您稍后会对此感到烦恼(您甚至可能不应该这样做,并将这种负担留给您的用户或程序的打包程序)。

我确定程序[....]被文件管理器视为可执行文件吗?

那是一个系统管理员的问题,可能取决于您的桌面环境窗口管理器 一开始我不会打扰,但是稍后您可能会有一些桌面条目说明 (某些文件以.desktop结尾)描述您的程序。 因此,请使用编辑器创建该asdff.desktop文本文件 (它可能应该进入$HOME/Desktop/目录中,并应提及绝对文件路径)。

 Exec=./home/miguel/Desktop/asdff 

. 是拼写错误,应为Exec=/home/miguel/Desktop/asdff不带任何点。

Linux上的每个程序都由execve(2)启动(由shell,您的桌面环境或其他程序完成)。 您应该在终端仿真器中使用外壳程序来启动大多数程序 ,尤其是在开发它们时。 而且,您当然应该期望用户使用外壳程序来运行您的程序(我讨厌用鼠标启动程序),也许是在将您的程序与其他程序结合在一起的一些外壳程序脚本中 另请阅读有关Unix哲学的信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM