我已经编写了一个C ++程序并将其编译为产生一个.out文件。但是,每当我尝试运行它时,都会被拒绝权限。我读到我们可以使用sudo,但是我无法完全使用它。我使用类似sudo“ ./a.out”之类的东西,但这也行不通。
编辑:
这是我尝试“ ./a.out”时收到的消息。
bash: ./a.out: Permission denied
我已经编写了一个C ++程序并将其编译为产生一个.out文件。但是,每当我尝试运行它时,都会被拒绝权限。我读到我们可以使用sudo,但是我无法完全使用它。我使用类似sudo“ ./a.out”之类的东西,但这也行不通。
编辑:
这是我尝试“ ./a.out”时收到的消息。
bash: ./a.out: Permission denied
Answers:
通常,g++
授予创建的文件执行权限。如果您未通过该-o
选项,则文件将命名为a.out
。
为什么文件没有设置执行位的两个可能原因及其解决方法:
的umask值被设置为一个值等0133,从而防止执行位被集。解决方案:显式设置权限:
chmod 755 a.out
fmask=0022
或umask=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
C:\Ubuntu
已创建)。除非您将文件放在“ C:”而不是Ubuntu安装上,否则这应该不是问题。如果您不使用Windows,或者有足够的磁盘空间,建议您在专用分区上安装Ubuntu。同样,NTFS / FAT32不支持Linux权限,因此您可以运行sudo chown user file
,chmod 755 file
它将无法工作。为此,您确实需要一个EXT文件系统。
~
,我~/projects
就将所有项目创建并放入其中,您可以做同样的事情。
.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”。
第一个答案中FAT文件系统的解决方法
“如果将文件放在FAT32格式的闪存驱动器上,则可能是这种情况。解决方案:(...)使用fmask = 0022或umask = 0022挂载驱动器(忽略fmask)。”
通常不起作用-无论如何,umask的默认值大部分都是0022,因此不会做任何更改。
但是,另一个mount参数的默认设置实际上禁止执行二进制文件,特别是如果FAT文件系统是作为非root用户安装的: noexec
因此,只需使用以下选项安装FAT格式的驱动器exec
:
sudo mount -o exec /dev/sd.. /mountpoint
(通常必须以root身份完成,因此是“ sudo”),您应该能够直接从那里执行二进制文件。
我敢打赌,您的程序没有'main()'函数,就好像它没有,您的编译器将使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