无法执行.out文件,权限被拒绝


11

我已经编写了一个C ++程序并将其编译为产生一个.out文件。但是,每当我尝试运行它时,都会被拒绝权限。我读到我们可以使用sudo,但是我无法完全使用它。我使用类似sudo“ ./a.out”之类的东西,但这也行不通。

编辑

这是我尝试“ ./a.out”时收到的消息。

bash: ./a.out: Permission denied

ls -l a.out的输出是什么?文件a.out的输出是什么?可执行文件是否在USB记忆棒/硬盘上?
JRT

它在硬盘上。在编译过程后不久便创建了相同的文件。我没有设置任何其他参数。
Shamim Hafiz

-rw ------- 1 shamimhafiz shamimhafiz 7721 2011-05-22 23:30 a.out是ls -l a.out的输出
Shamim Hafiz

因此,根据ls -l a.out的输出,这是一个权限问题。如果执行chmod + x a.out,然后尝试./a.out,它执行吗?umask的输出是什么?
JRT

@JRT:它没有执行。进行“ chmod + x a.out”不会给出任何消息,但是看起来没有任何效果。再次尝试“ ls -l a.out”仍然显示相同的内容。
Shamim Hafiz's

Answers:


19

通常,g++授予创建的文件执行权限。如果您未通过该-o选项,则文件将命名为a.out

为什么文件没有设置执行位的两个可能原因及其解决方法:

  1. umask值被设置为一个值等0133,从而防止执行位被集。解决方案:显式设置权限:

    chmod 755 a.out
    
  2. 您正在使用的文件系统不支持Linux权限。如果要将文件放在FAT32格式的闪存驱动器上,可能会是这种情况。解决方案:要么备份的文件,并格式化为ext2或与安装驱动器fmask=0022umask=0022(省略fmask)。有关更多详细信息,请参见安装手册页上的“ 脂肪安装选项”部分。

对于未设置执行位的bash脚本,可以运行bash file.sh。对于具有可执行内容的所有文件(已编译文件和带有shebang行#!/path/to/interpreter集的文件)都存在这种功能。要执行未设置执行位的文件,请使用特殊文件/lib/ld-linux.so.2(或/lib/ld-linux-x86-64.so.2对于64位应用程序)运行这样的程序:

/lib/ld-linux-x86-64.so.2 a.out

补充一下,这个答案更有趣,我通过Windows安装Ubuntu的方式在C驱动器(Windows安装驱动器)上创建了一个名为文件夹。该驱动器的格式为FAT32。这可能与这有关吗?
Shamim Hafiz's

1
您已经完成了Wubi安装(C:\Ubuntu已创建)。除非您将文件放在“ C:”而不是Ubuntu安装上,否则这应该不是问题。如果您不使用Windows,或者有足够的磁盘空间,建议您在专用分区上安装Ubuntu。同样,NTFS / FAT32不支持Linux权限,因此您可以运行sudo chown user filechmod 755 file它将无法工作。为此,您确实需要一个EXT文件系统。
Lekensteyn

3
同样,Windows文件系统都不支持Linux文件权限。您应该将文件放在格式为EXT的文件系统上。
Lekensteyn 2011年

1
因此,仅在属于Ubuntu的文件夹上工作就可以解决问题,对吗?我的意思是,我不应该使用不属于Ubuntus文件系统结构的文件夹吗?
Shamim Hafiz's

3
确实,只要停留在中~,我~/projects就将所有项目创建并放入其中,您可以做同样的事情。
Lekensteyn

5

.out是不寻常的扩展名。通常,这通常表示“跟踪输出”文件。

检查用于编译的语法

例如

gcc myfile.c /usr/lib/libsomelibrary.a -o outputfilename

或者可能

g++ myfile.cpp -lm -o outputfilename

您应该检查一下文件上的可执行位是否已设置

ls -l a.out

或者您可以强制执行位

chmod +x a.out

然后您可以运行文件

./a.out

或简单地

a.out

您也许还应该检查输出文件是否已正确写入为二进制文件

file a.out

这将报告文件的格式-脚本还是二进制

除非您限制了谁应该可以运行可执行文件,否则您几乎不需要以root用户身份执行。

如果您已经以root身份进行编译(例如sudo make),或者拥有以root身份安装了可执行文件的Makefile,那么我建议您在用户登录后重新获得权限。

sudo chown fred:fred a.out

即用您的用户名替换“ fred”。


谢谢你提供的详情。我实际上是作为唯一用户登录的,并且我假设我是主要用户。我不太确定,为什么仍然需要使用管理身份验证。我将如何删除此选项,以便始终可以运行文件。
Shamim Hafiz,

已更新-希望澄清并回答您的问题。
fossfreedom

a.out是编译器的遗留功能,因此,如果您不要求提供文件名,它将生成可预测的文件名。这不是权限问题,而是对编译器和C ++工作方式的误解。
SpamapS 2011年

Linux / Unix不依靠文件扩展名来确定文件类型。通常,可执行文件根本没有扩展名。而且,外壳程序之间可执行文件的格式通常也不相同。除非它是某种特殊的外壳,否则所有外壳都应与./a.out一起使用。
JRT

1
Gunner-请从编译命令开始,然后将完整的输出复制并粘贴到终端中,然后输入ls -l,chmod + x,最后执行。请确认通过键入“WHOAMI”你的名字
fossfreedom

4

只需将文件夹复制到您的主文件夹即可。您可能正在尝试在外部驱动器等上运行它。


0

第一个答案中FAT文件系统的解决方法

“如果将文件放在FAT32格式的闪存驱动器上,则可能是这种情况。解决方案:(...)使用fmask = 0022或umask = 0022挂载驱动器(忽略fmask)。”

通常不起作用-无论如何,umask的默认值大部分都是0022,因此不会做任何更改。

但是,另一个mount参数的默认设置实际上禁止执行二进制文件,特别是如果FAT文件系统是作为非root用户安装的: noexec

因此,只需使用以下选项安装FAT格式的驱动器exec

sudo mount -o exec /dev/sd.. /mountpoint

(通常必须以root身份完成,因此是“ sudo”),您应该能够直接从那里执行二进制文件。


-2

我敢打赌,您的程序没有'm​​ain()'函数,就好像它没有,您的编译器将使a.out可执行文件。现在,它只是一个充满代码的目标文件,但是没有入口点。main()是C和C ++中的一个特殊函数名称,它告诉编译器创建程序,而不只是创建可以链接到程序或库的目标文件。

我很想知道您用来生成该文件的命令行,因为GNU GCC的c ++编译器g ++不会让我创建带有主要功能的简单程序:

#include <iostream>

using namespace std;

void no_main()
{
  cout << "Hello World" << endl;
}

$ g++ hello.cc
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 4 has invalid symbol index 11
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 5 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 6 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 7 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 8 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 9 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 10 has invalid symbol index 12
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 11 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 12 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 13 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 14 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 15 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 16 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 17 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 18 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 19 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 20 has invalid symbol index 21
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/../../../crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status

但是,如果我将“ void no_main”更改为“ int main”,则它可以工作:

$ g++ hello.cc
$ ./a.out
Hello World

5
如果他没有主要功能,它将不会链接,因此不会产生a.out文件。
JRT
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.