Різниця між файлами .a .o та .lo


Відповіді:


46

Файл '.lo' є бібліотечним об'єктом , який може бути вбудований у спільну бібліотеку, а файл '.o' є стандартним файлом об'єкта

Файл .lo - це об'єкт libtool , який Libtool використовує для визначення того, який файл об'єкта може бути вбудований у спільну бібліотеку


3
Чи означає це, що файли .o НЕ МОГУТЬ вбудовувати у спільну бібліотеку?
Радж


8
Ви дійсно хочете, щоб вся ваша відповідь була у формі посилань?
Fixee

@Raj ні, це не означає, що іменування - це зручність, а не вимога.
Слава

92

Різниця між .o, .a, .lo та .so.

Резюме

  • .o, як правило, не є об'єктом PIC-файлу, який видається компілятором (до етапу компонування). При з'єднанні з exe код буде включений до виконуваного файлу - ми зв'язуємось під час з'єднання.
  • .a - це, як правило, архівна бібліотека, що містить один або кілька файлів .o [не PIC]. При зв’язку з exe, конкретні файли "* .o" в архіві будуть вставлені у виконуваний файл.
  • .lo - це, як правило, "бібліотечний об'єкт", який містить код PIC, компільований вручну за допомогою gcc -fPIC або використовуючи libtool .
  • .so - це файли "спільного об'єкта". Вони містять об'єкти PIC.

Примітка:

  • Якщо вам потрібні статичні виконувані файли, використовуйте файли ".o" та ".a".
  • Якщо вам потрібні / потрібні динамічні виконувані файли, зв’язування з бібліотеками під час виконання, використовуйте файли .lo та .so .

Вступ

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

Тип файлу .o

Під час компіляції файлу .o це файл об'єкта, що містить об'єктний код, випущений компілятором для цільової платформи. Щоб створити файл .o :

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

Зверніть увагу, що цей приклад не створив незалежний від позиції код (PIC). Ми вважаємо це об’єктом для можливого включення до статичної бібліотеки або виконуваного файлу. Тобто, коли ми пов'язуємо виконуваний файл з файлом .o , код у файлі .o вставляється у виконуваний файл - він прив'язується під час побудови, а не під час виконання. Це означає, що виконуваний файл можна перерозподілити, не включаючи файл .o. Застереження: за домовленістю файл .o вважається не PIC. Зазвичай ми називаємо об'єктні файли PIC із розширенням .lo .

Тип файлу .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 compile створює як файл .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 був створений з ao в ньому. Цей файл є кодом PIC, незважаючи на назву. Libtool перемістив цей файл до поточного каталогу та змінив розширення на .lo .

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

Тип файлу. Так

За домовленістю .so передбачає файл бібліотеки "спільний об'єкт". Ми розміщуємо файли об'єктів PIC у спільних бібліотеках. У контракті з файлами .o та .a , коли ми зв'язуємось із файлами .so, код не включається в отриманий компільований файл. Тобто ми використовуємо прив'язку часу виконання (як у випадку .lo ). Існує більше однієї форми виконання, але ми не будемо тут вдаватися до цього.


3
Чи є книга, яка висвітлює тип інформації, яку ви пояснили у своїй відповіді? Я можу знаходити лише корисну практичну інформацію, наприклад, вашу публікацію на форумах тощо. Знання фрагментовані і ніколи не подаються як послідовне висвітлення того, як будуються та працюють програми.
wandadars

1
Ні. Файли * .lo - це зручні для читання текстові файли, що містять назву об'єкта pic та non_pic об'єкта. Код PIC зазвичай входить, .libs/a.oа nonPIC - в a.o. Отже, libtool створює 3 файли: 2 об'єктних файли ( .o), один PIC і один .loфайл не +, який описує, де знаходяться файли.
kasukasz Daniluk

1
@wandadars: Перегляньте "Зв'язуючі та навантажувачі" Джона Р. Левіна linker.iecc.com
Генріх Хартманн

Це набагато якісніша відповідь, і вона повинна бути прийнятою.
Mayank Sharma

4

.loФайл представляє собою бібліотеку об'єктів, які можуть бути вбудовані в загальну бібліотеку, а .oфайл являє собою стандартний файл об'єкта. Додаткова інформація: Як встановити та використовувати спільну бібліотеку libtool (файли .lo)?


1
Чи означає це, що файли .o НЕ МОГУТЬ вбудовувати у спільну бібліотеку?
Радж

5
Найважливіша технічна відмінність полягає в тому, що файл .lo повинен містити переміщуваний код (-fPIC у GCC), тоді як файл .o може не містити.
kusma
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.