.o
файлы - это объектные файлы, скомпилированные из исходного кода компилятором. Это необработанные двоичные файлы, которые еще не связаны с какой-либо зависимой от платформы библиотекой. Вы не можете просто запустить файл .o
в своей системе.
gcc -c program.c
(Обратите внимание, что -c flag
говорит компилятору только компилировать.)
создаст двоичный файл program.o
который вы не можете запустить на своей платформе немедленно. Вам нужно связать его с crt objects
и dynamic libraries
для платформы.
Для моей системы Linux.
ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o program.o -lc /usr/lib/x86_64-linux-gnu/crtn.o
Теперьэто создаст исполняемый файл a.out
, который вы можете запустить прямо из консоли.
однако при запуске
gcc program.c
компилятор выполнит для вас связующую часть и выдаст a.out
исполняемый файл.
Вывод: компиляторы генерируют .o
объектные файлы путем компиляции исходного кода, который затем необходимо связать с объектными файлами и библиотеками платформы для создания исполняемого объектного файла .out
для этой платформы,процесс, называемый связыванием.
Некоторые ссылки: [1] https://en.wikipedia.org/wiki/A.out
[2] https://en.wikipedia.org/wiki/Crt0
[3] https://en.wikipedia.org/wiki/Object_file
[4] http://man7.org/linux/man-pages/man8/ld.so.8.html
Редактировать: флаг -o используется вместовывод компилятора в указанный файл. Это выдержка из руководства.
-o file
Поместить вывод в файл file . Это применимо к любому виду выходных данных, будь то исполняемый файл, объектный файл, файл ассемблера или предварительно обработанный код C.
If -o is not specified, the default is to put an executable file
in a.out, the object file for source.suffix in source.o, its
assembler file in source.s, a precompiled header file in
source.suffix.gch, and all preprocessed C source on standard
output.
Расширение здесь не имеет значения.
Файловые системы для UNIX-подобных операционных систем не отделяют метаданные расширения от остальной части имени файла. Точка - это просто еще один символ в главном имени файла. Он в основном предназначен для пользователя. Чаще всего, особенно в двоичных файлах, сам файл содержит внутренние метаданные, описывающие его содержимое.
И .o, и .out, или любые файлы расширений будут содержать одинаковые двоичные выходные данные, если онииз той же операции компиляции.