无法从nautilus运行可执行文件

时间:2018-05-18 13:37:34

标签: c++ ubuntu g++ nautilus

(the warning that shows up)在Ubuntu 18.04上,我编译了一个c ++示例,其中只包含stdio.h和使用g++ test.cpp -o test的空主函数 。

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

然而,一旦我继续使用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

3 个答案:

答案 0 :(得分:2)

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

Because Nautilus is patched to remove the ability to execute programs. It's a security problem.

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

答案 1 :(得分:1)

此答案假设您的test程序位于您的主文件夹中,/home有自己的分区,noexec选项(这是Ubuntu上的默认选项)。

man mount说:

  

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

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

如果是这样,您可以将程序移到/home之外,或者通过编辑/etc/fstab文件来更改主分区的装载方式。请参阅man fstab,但基本上您要添加exec选项。

其他假设:

  1. 无论出于何种原因,您的test程序都没有执行暂停。请使用$stat test
  2. 进行检查
  3. 无论出于何种原因,您为测试程序提供的名称都会使用系统的shell内置命令test进行推断。重命名您的程序。

答案 2 :(得分:0)

使用您的互动terminal emulatorcommand line上的shell内运行您的计划。了解PATH variable(您可能会更改)通过配置交互式shell,例如在~/.bashrc中。您的shell将使用execve(2)(在globbing之后)运行您的executable二进制文件(因此它应保留在某个可执行分区上,如answered by YSC并且可执行 - 请参阅{{3 }})。您想要查看程序的 stdout stderr 输出。另请参阅stat(2)答案。

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

只有当您的程序是rpath程序时(例如,为GUI widget toolkit进行编码),您才应该(最终)能够通过单击在桌面上运行它(详情可能特定于您的Qt)。你以后会这么烦恼(你甚至可能不应该这样做,并把这个负担留给你的用户,或你的程序的desktop environment)。

  

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

这是一个系统管理员问题,可能取决于您的packagerdesktop environment。我一开始并不打扰,但稍后您可能会有一些window manager(某些文件以.desktop结尾)来描述您的程序。因此,使用编辑器创建asdff.desktop 文本文件(它可能会进入您的$HOME/Desktop/目录,并应提及绝对文件路径。)< / p>

Exec=./home/miguel/Desktop/asdff

.是一个拼写错误,应该是Exec=/home/miguel/Desktop/asdff没有任何点。

Linux上的每个程序都由desktop entry specification启动(由shell,桌面环境或其他程序完成)。您应该在终端模拟器中使用shell来启动大多数您的程序,尤其是在开发它们时。你肯定应该期望你的用户使用他们的shell来运行你的程序(我讨厌使用我的鼠标启动程序),也许在某些execve(2)中将你的程序与其他程序结合起来。另请阅读shell script