"bash: No such file or directory" even though file exists [closed]

Я довольно новичок в Ubuntu, и недавно я создал .o файл, набрав его в терминале:

g++ -Wall -std=c++11 -c average.cpp -o average.o

Однако, когда я попытался выполнить .o файл, я получил эту ошибку:

bash: ./average: No such file or directory

несмотря на то, что файл у меня явно есть. Поэтому я решил набрать файл average.o, что дало мне следующее: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped.

Является ли проблемой тот факт, что это должен быть 32-битный исполняемый файл, и если да, то как я могу изменить его на 32-битный исполняемый файл?

Редактировать: Итак, я смог создать average, но когда я пытаюсь запустить его, я получаю эту ошибку:

terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_M_construct null not valid
Aborted (core dumped)

Edit 2: Я смог исправить дамп ядра и смог дать разрешение на запуск моего файла, но теперь я получаю новую ошибку:

bash: ./average: cannot execute binary file: Exec format error.

Когда я выполнил file averge, я получил следующее:

average: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped.

0
задан 7 March 2017 в 02:41

3 ответа

.o файлы не являются исполняемыми файлами.

Попробуйте одно из следующего:

  • Пропустите создание .o файл и создание исполняемого файла

    g++ -Wall -std=c++11 average.cpp -o average
    ./average
    
  • Свяжитесь .o файл в исполняемый файл

    g++ -Wall -std=c++11 -c average.cpp -o average.o
    g++ -Wall -std=c++11 -o average average.o
    ./average
    

Если average файл все еще не выполняет попытку, дающую его полномочия

chmod +x average

РЕДАКТИРОВАНИЕ (07/03/17)

Объяснение

Меня попросили объяснить, что делают команды, таким образом, здесь это идет.

g ++

Это - компилятор, который интерпретирует Ваш код и преобразует его в машинный код, который может интерпретировать Ваша машина.

Можно читать больше об этом на страницах справочника. Просто откройте терминал и тип man g++.

- Стена

Этот флаг говорит компилятору говорить Вам о почти всех предупреждениях (Стена = Предупреждают все). Смотрите на рев кода.

int i = 1;
if (i > i) { ... }

Если Вы не помещаете флаг -Wall никакое предупреждение не показывают, но если Вы делаете Вы видите что-то как следующее:

warning: self-comparison always evaluates to false [-Wtautological-compare]
    if (i > i) {}

- std=c ++ 11

С этим флагом Вы говорите компилятор который версия языка использовать. Это - довольно сложная тема, но в коротком C++ живой язык, означая, что он изменяет сверхурочное время и улучшается, C++ 11 является одним из тех изменений, и он добавляет много улучшений. В наше время можно использовать -std=c++14 и когда-то в этом году Вы сможете использовать -std=c++17.

Вы кажетесь плохо знакомыми с C++ так беспокойство не обо всей этой версии вещи!:D

- c

Скомпилируйте без соединения.

В основном позволяет создание .o файлы (иначе объектные файлы), которые содержат набор данных, главным образом скомпилированного кода и информации для компилятора для соединения объектов вокруг.

Это делает компиляцию крупного проекта более быстрой, с тех пор при изменении одного файла, это только должно создать один объектный файл и связать его с уже скомпилированными объектными файлами.

- o файл

Взятие от man страница:

Место производится в файле файла. Это относится к любому виду вывода, производится, предварительно обработал ли он быть исполняемым файлом, объектным файлом, ассемблерным файлом или код C.

В основном этот флаг говорит компилятор, куда поместить результат любого процесса, он делает (compiling/linking/...).


Надеюсь, что это объяснение помогает!:)

4
ответ дан 3 November 2019 в 16:21

необходимо проверить полномочия файла и удостовериться, что полномочия установлены позволить файлу выполняться как программа также при попытке выполнить файл, необходимо поставить.o расширение как по опыту, это - единственный способ, которым я смог выполнить файлы из командной строки

1
ответ дан 3 November 2019 в 16:21
g++ -Wall -std=c++11 -c average.cpp -o average.o

создаст average.o файл не эти average, вот почему Вы получаете no such file ошибка

Первый ящик average файл и затем пытаетесь выполнить его.

Попытка это:

g++  -Wall -std=c++11 average.cpp -o average

И затем дают разрешение:

   chmod +x average

затем выполняют его

./average
0
ответ дан 3 November 2019 в 16:21

Другие вопросы по тегам:

Похожие вопросы: