Я записал программу C++ и соответствовал она для создания a.out файла. Однако каждый раз, когда я пытаюсь выполнить его, я отклонил Разрешение. Я считал, что мы можем использовать sudo, но я не могу вполне заставить его работать. Я использую что-то как, sudo "./a.out" кроме того также не работает.
Править:
Вот сообщение, которое я получаю, когда я пробую "./a.out".
bash: ./a.out: Permission denied
Обычно, g++
дает создаваемому файлу разрешения на выполнение. Если Вы не передадите опцию -o
, файл будет назван a.out
.
Две возможные причины, по которым в Вашем файле не установлен бит выполнения, с их решениями:
Значение маски umask value установлено в значение типа 0133, тем самым предотвращая установку бита выполнения. Решение: установить разрешения явно:
chmod 755 a.out
fmask=0022
или umask=0022
(опустив fmask
). Смотрите раздел Mount options for fat на странице руководства по установке .Для 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
.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), или у вас есть Makefile, который установил исполняемый файл от имени root, то могу я предложить вам вернуть разрешение, как пользователь, вошедший в систему
т.е.
sudo chown fred:fred a.out
т.е. заменить "fred" на ваш идентификатор пользователя.
Я бы поспорил, что ваша программа не имеет функции 'main()', как если бы она имела, ваш компилятор сделал бы a.out исполняемым файлом. Сейчас это просто объектный файл, полный кода, но точки входа нет. main() - это специальное имя функции на Си и Си++, которая говорит компилятору создать программу, а не просто объектные файлы, которые можно компоновать с программой или библиотекой.
Мне было бы интересно узнать, какую командную строку Вы использовали для создания этого файла, так как компилятор GNU GCC c++, g++, не позволит мне создать простую программу w/o основной функции:
#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
просто скопируйте папку в свою домашнюю папку, и она будет работать. Вероятно, вы пытаетесь запустить его на внешнем диске или что-то в этом роде.
Временное решение для файловых систем FAT в первом ответе
«Это могло в том случае, если вы помещаете файлы на флеш-накопитель в формате FAT32. Решение: (...) смонтируйте диск с fmask = 0022 или umask = 0022 (без fmask). "
обычно не работает - по умолчанию для umask в любом случае обычно 0022, так что это ничего не меняет.
Другой параметр монтирования по умолчанию, однако, эффективно запрещает выполнение двоичных файлов, особенно если файловая система FAT смонтирована как пользователь без полномочий root: noexec
Так что просто смонтируйте диски в формате FAT с опцией exec
, например, так:
sudo mount -o exec /dev/sd.. /mountpoint
(обычно это нужно делать как root, отсюда и sudo) и вы сможете запускать двоичные файлы прямо оттуда.