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

Разница между файлами .a.o и .lo

В чем разница между .a .o и .lo файлом в C?

4b9b3361

Ответ 2

Разница между .o,.a,.lo и .so.

Резюме

  • .o, как правило, является не-PIC-объектным файлом, выпущенным компилятором (до этапа компоновщика). Когда он связан с exe, код будет включен в исполняемый файл - мы связываемся со временем связи.
  • .a обычно представляет собой архивную библиотеку, содержащую один или несколько файлов .o [non-PIC]. При соединении с exe в файл будут вставлены конкретные файлы "*.o" в архиве.
  • .lo обычно является "объектом библиотеки", который содержит код PIC, скомпилированный вручную с помощью gcc -fPIC или с помощью libtool.
  • .so файлы являются файлами "shared object". Они содержат объекты PIC.

Примечание:

  • Если вам нужны статические исполняемые файлы, используйте файлы ".o" и ".a".
  • Если вам нужно/нужно, чтобы динамические исполняемые файлы связывались с библиотеками во время выполнения, используйте файлы .lo и .so.

Введение

Хотя мне нравятся ответы выше, они не охватывают форму .a/архивной библиотеки. Итак, здесь я расскажу обо всех трех с бонусом добавления в формат .so библиотеки. Кроме того, в духе stackexchange, я буду использовать больше текста, если ссылки будут сломаны (обратите внимание, что мне не нужны ссылки ссылки для этого).

Тип файла .o

При компиляции файла .o это объектный файл, содержащий исходный код компилятора для целевой платформы. Чтобы создать файл .o:

gcc -c filename.c     <==== creates filename.o

Обратите внимание, что в этом примере не создается независимый код позиции (PIC). Мы рассматриваем этот объект для возможного включения в статическую библиотеку или исполняемый файл. То есть, когда мы связываем исполняемый файл с файлом .o, код в .o файле вставляется в исполняемый файл --- он привязан во время сборки, а не во время выполнения. Это означает, что исполняемый файл может быть перераспределен без включения файла .o. Предостережение: это соглашение о том, что файл .o считается не-PIC. Обычно мы называем объектные файлы PIC расширением .lo.

Тип файла .a

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

Мы используем команду ar для управления архивными библиотеками. Ниже в примере, что (1) создает архивную библиотеку из .o файлов, тогда (2) перечисляет содержимое одного.

Создать библиотеку

$ ls *.o
a.o  b.o  c.o                 <=== the files going in the archive

$ ar q libmyStuff.a *.o       <=== put *.o files in an archive (or new one)
ar: creating libmyStuff.a    

$ ls *.a                      <=== just show the library created
libmyStuff.a

Отобразить содержимое архивной библиотеки

$ ar t libmyStuff.a
a.o
b.o
c.o

Тип файла .lo

Использование .lo - это соглашение, которое часто используется для независимых по объектам объектных файлов. В текущем каталоге команда компиляции libtool создает файл .lo и файл .o, один с кодом PIC и один без кода PIC. Смотрите следующий результат:

$ libtool compile gcc -c a.c
libtool: compile:  gcc -c a.c  -fPIC -DPIC -o .libs/a.o  <== PIC code
libtool: compile:  gcc -c a.c -o a.o >/dev/null 2>&1     <== Not-PIC code

$ ls a.lo a.o
a.lo  a.o       <=== a.lo contains the PIC code.

Также обратите внимание, что подкаталог .libs был создан с помощью a.o в нем. Этот файл является кодом PIC, несмотря на имя. Libtool переместил этот файл в текущий каталог и изменил расширение на .lo.

Вы всегда можете вручную создавать файлы .lo, просто используя параметры PIC для gcc при компиляции. Переместите полученные файлы .o в расширение .lo.

Тип файла .so

По соглашению .so подразумевается файл библиотеки "shared object". Мы помещаем объектные файлы PIC в разделяемые библиотеки. В контракте с файлами .o и .a, когда мы связываемся с .so файлами, код не включается в результирующий скомпилированный файл. То есть мы используем привязку времени выполнения (как в случае .lo). Существует более одной формы привязки времени выполнения, но мы не будем вдаваться в это.