Я довольно новичок в 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
.
.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)
Меня попросили объяснить, что делают команды, таким образом, здесь это идет.
Это - компилятор, который интерпретирует Ваш код и преобразует его в машинный код, который может интерпретировать Ваша машина.
Можно читать больше об этом на страницах справочника. Просто откройте терминал и тип man g++
.
Этот флаг говорит компилятору говорить Вам о почти всех предупреждениях (Стена = Предупреждают все). Смотрите на рев кода.
int i = 1;
if (i > i) { ... }
Если Вы не помещаете флаг -Wall
никакое предупреждение не показывают, но если Вы делаете Вы видите что-то как следующее:
warning: self-comparison always evaluates to false [-Wtautological-compare]
if (i > i) {}
С этим флагом Вы говорите компилятор который версия языка использовать. Это - довольно сложная тема, но в коротком C++ живой язык, означая, что он изменяет сверхурочное время и улучшается, C++ 11 является одним из тех изменений, и он добавляет много улучшений. В наше время можно использовать -std=c++14
и когда-то в этом году Вы сможете использовать -std=c++17
.
Вы кажетесь плохо знакомыми с C++ так беспокойство не обо всей этой версии вещи!:D
Скомпилируйте без соединения.
В основном позволяет создание .o
файлы (иначе объектные файлы), которые содержат набор данных, главным образом скомпилированного кода и информации для компилятора для соединения объектов вокруг.
Это делает компиляцию крупного проекта более быстрой, с тех пор при изменении одного файла, это только должно создать один объектный файл и связать его с уже скомпилированными объектными файлами.
Взятие от man
страница:
Место производится в файле файла. Это относится к любому виду вывода, производится, предварительно обработал ли он быть исполняемым файлом, объектным файлом, ассемблерным файлом или код C.
В основном этот флаг говорит компилятор, куда поместить результат любого процесса, он делает (compiling/linking/...).
Надеюсь, что это объяснение помогает!:)
необходимо проверить полномочия файла и удостовериться, что полномочия установлены позволить файлу выполняться как программа также при попытке выполнить файл, необходимо поставить.o расширение как по опыту, это - единственный способ, которым я смог выполнить файлы из командной строки
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