У чому різниця між файлом .a
.o
і .lo
файлом у C?
Відповіді:
Файл '.lo' є бібліотечним об'єктом , який може бути вбудований у спільну бібліотеку, а файл '.o' є стандартним файлом об'єкта
Файл .lo - це об'єкт libtool , який Libtool використовує для визначення того, який файл об'єкта може бути вбудований у спільну бібліотеку
Примітка:
Хоча мені подобаються відповіді вище, вони не охоплюють форму бібліотеки .a / archive. Тож тут я звернусь до всіх трьох із бонусом додавання також у форматі .so бібліотеки. Крім того, в руслі stackexchange я буду використовувати більше тексту на випадок, якщо посилання порвуться (зауважте, що мені не потрібні посилальні посилання для цього).
Під час компіляції файлу .o це файл об'єкта, що містить об'єктний код, випущений компілятором для цільової платформи. Щоб створити файл .o :
gcc -c filename.c <==== creates filename.o
Зверніть увагу, що цей приклад не створив незалежний від позиції код (PIC). Ми вважаємо це об’єктом для можливого включення до статичної бібліотеки або виконуваного файлу. Тобто, коли ми пов'язуємо виконуваний файл з файлом .o , код у файлі .o вставляється у виконуваний файл - він прив'язується під час побудови, а не під час виконання. Це означає, що виконуваний файл можна перерозподілити, не включаючи файл .o. Застереження: за домовленістю файл .o вважається не PIC. Зазвичай ми називаємо об'єктні файли PIC із розширенням .lo .
.А тип файлу є « архів » бібліотека. Він містить один або кілька файлів .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 - це домовленість, яка часто використовується для розташування незалежних об'єктних файлів. У поточному каталозі команда 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 ). Існує більше однієї форми виконання, але ми не будемо тут вдаватися до цього.
.libs/a.o
а nonPIC - в a.o
. Отже, libtool створює 3 файли: 2 об'єктних файли ( .o
), один PIC і один .lo
файл не +, який описує, де знаходяться файли.
.lo
Файл представляє собою бібліотеку об'єктів, які можуть бути вбудовані в загальну бібліотеку, а .o
файл являє собою стандартний файл об'єкта. Додаткова інформація: Як встановити та використовувати спільну бібліотеку libtool (файли .lo)?