(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
答案 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上的默认选项)。
noexec 不允许直接执行已挂载的任何二进制文件 文件系统。
这意味着您的系统会阻止您在主文件夹上运行测试程序。
如果是这样,您可以将程序移到/home
之外,或者通过编辑/etc/fstab
文件来更改主分区的装载方式。请参阅man fstab
,但基本上您要添加exec
选项。
其他假设:
test
程序都没有执行暂停。请使用$stat test
。test
进行推断。重命名您的程序。答案 2 :(得分:0)
使用您的互动terminal emulator在command 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)。
我确保程序[....]被文件管理器视为可执行文件?
这是一个系统管理员问题,可能取决于您的packager或desktop 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。