Подтвердить что ты не робот

Что такое *.o файл?

Я компилирую собственный проект. И эта ошибка была остановлена:

LINK || фатальная ошибка LNK1181: невозможно открыть входной файл 'OBJ\победа\релиз\SRC\Lua\bindings.o' |

Компиляция с использованием Code:: Blocks с компилятором VS 2005/2008 под win7. Также существует множество других пустых каталогов, в которых отсутствуют файлы *.o.

Что они делают?

4b9b3361

Ответ 1

Файл, заканчивающийся на .o, является объектным файлом. Компилятор создает объектный файл для каждого исходного файла, прежде чем связывать их вместе, в окончательный исполняемый файл.

Ответ 2

Вы получили некоторые ответы, и большинство из них правильные, но пропустите то, что (я думаю), возможно, здесь и кроется.

Я предполагаю, что у вас есть make файл, который вы пытаетесь использовать для создания исполняемого файла. Если вы не знакомы с ними, makefiles перечисляет зависимости между файлами. Для действительно простого случая это может выглядеть примерно так:

myprogram.exe: myprogram.o
    $(CC) -o myprogram.exe myprogram.o

myprogram.o: myprogram.cpp
    $(CC) -c myprogram.cpp

Первая строка говорит, что myprogram.exe зависит от myprogram.o. Вторая строка рассказывает, как создать myprogram.exe из myprogram.o. В третьей и четвертой строках написано, что myprogram.o зависит от myprogram.cpp и от myprogram.cpp, как создать myprogram.o из myprogram.cpp 'соответственно.

Я предполагаю, что в вашем случае у вас есть make файл, подобный приведенному выше, который был создан для gcc. Проблема, с которой вы сталкиваетесь, заключается в том, что вы используете ее с MS VC вместо gcc. Как это бывает, MS VC использует ".obj" в качестве расширения для своих объектных файлов вместо ".o".

Это означает, что когда make (или его эквивалент, встроенный в IDE в вашем случае) пытается собрать программу, он смотрит на эти строки, чтобы попытаться выяснить, как собрать myprogram.exe. Для этого он видит, что ему нужно собрать myprogram.o, поэтому он ищет правило, которое сообщает ему, как создать myprogram.o. Это говорит о том, что он должен скомпилировать файл .cpp, так что он делает это.

Затем все выходит из строя - компилятор VC++ генерирует myprogram.obj вместо myprogram.o в качестве объектного файла, поэтому, когда он пытается перейти к следующему шагу для создания myprogram.exe из myprogram.o, он обнаруживает, что его попытка при создании myprogram.o просто не получилось. Он сделал то, что было сказано правилом, но это не произвело myprogram.o как было обещано. Он не знает, что делать, поэтому выходит и выдает сообщение об ошибке.

Решение этой конкретной проблемы, вероятно, довольно простое: отредактируйте файл make так, чтобы все объектные файлы имели расширение .obj вместо .o. Существует много вопросов, решит ли это все, хотя - это может быть все, что вам нужно, или это может просто привести к другим (возможно, более сложным) проблемам.

Ответ 3

Файл объектного файла .o. (также .obj в Windows) содержит скомпилированный объектный код (то есть машинный код, созданный вашим компилятором C или С++) вместе с именами функций и других объектов, содержащихся в файле. Файлы объектов обрабатываются компоновщиком, чтобы создать окончательный исполняемый файл. Если ваш процесс сборки не создал эти файлы, возможно, что-то не так с вашими файлами makefile/project.

Ответ 4

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

Инструкциям, которые ссылаются на метки, еще не будет назначен адрес для этих меток в .o файле.

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

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

Ответ 5

Ink-Jet - это правильно. Более конкретно,.o(.obj) - или объектный файл - это один исходный файл, скомпилированный в машинный код (я не уверен, что "машинный код" является тем же или похожим на исполняемый машинный код). В конечном счете, это промежуточное звено между исполняемой программой и исходным файлом с открытым текстом.

Компилятор использует файлы o для сборки исполняемого файла.

Wikipedia может иметь более подробную информацию. Я не уверен, сколько информации вам нужно или нужно.