2015-05-12 3 views
16

Я знаю .o являются объектными файлами, .a являются статическими библиотеками и .so являются динамическими библиотеками? Каково их физическое значение? Когда я могу использовать некоторые, а когда нет?В чем разница между файлами .o .a и .so?

+10

Почему это связано с Java? – JonK

ответ

2

.so являются файлами общей библиотеки. .a - файлы статической библиотеки.

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

.o являются объектные файлы (они компилируются из * .c файлов и могут быть связаны для создания исполняемых файлов, .a или .so библиотеки. Подробнее об этом here

+0

Не существует ли способ загрузки .a библиотек во время выполнения? – Pacerier

27

.a является «архив». Несмотря на то, архив может содержать любой тип файла, в контексте инструментальной цепочки GNU, это библиотека объектных файлов (другие инструментальные цепочки, особенно на WIndows, используют .lib с той же целью, но формат их обычно не является архивом общего назначения, и часто специфичны для инструментальной цепочки). Можно извлечь отдельные объектные файлы из архива, который по существу является тем, что делает компоновщик, когда он использует библиотеку.

.o - это файл объекта. Это код, который скомпилирован в машинный код, но не (как правило) полностью связан - он может иметь неразрешенные ссылки на символы, определенные в других объектных файлах (в библиотеке или отдельно), сгенерированные отдельной компиляцией. Файлы объектов содержат метаданные для поддержки связывания с другими модулями и, необязательно, также для символической отладки исходного уровня (например, в GDB). Другие инструментальные средства, как правило, в Windows, используют расширение .obj, а не .o.

.so - это общая библиотека объектов (или только разделяемая библиотека). Это динамически связано с исполняемым файлом, когда программа запускается, а не статически связана во время сборки. Он позволяет выполнять меньшие исполняемые файлы, а один экземпляр библиотеки объектов используется несколькими исполняемыми файлами. API-интерфейсы операционной системы обычно являются совместно используемыми библиотеками, и они часто используются также в GNU по причинам лицензирования, чтобы отделить код LGPL от закрытого исходного кода (например, я не юрист). Я не претендую на легитимность этого подхода в любая конкретная ситуация). В отличие от .o или .a файлов, .so файлы, используемые приложением, должны быть доступны в системе исполнения. Другие системы (опять же обычно Windows) используют .dll (динамическая библиотека ссылок) для этой же цели.

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

+0

Что касается «* .o файлов связаны перед объектным кодом в .a *", вы имеете в виду, что это происходит независимо от того, какой заказ вы указали? – Pacerier

1

Статические библиотеки - это архивы, которые содержат объектный код для библиотеки, при соединении с приложением, что код скомпилирован в исполняемый файл.

Общие библиотеки отличаются тем, что они не скомпилированы в исполняемый файл. Вместо этого динамический компоновщик ищет в некоторых каталогах нужные библиотеки, а затем загружает их в память. Одновременно один исполняемый файл может использовать одну и ту же разделяемую библиотеку, тем самым уменьшая объем использования памяти и размер исполняемого файла. Тем не менее, есть еще больше файлов для распространения с исполняемым файлом. Вы должны убедиться, что библиотека установлена ​​в систему пользователя где-нибудь, где линкер может ее найти, статическая привязка устраняет эту проблему, но приводит к большему исполняемому файлу.

+0

'Тем не менее, тогда есть больше файлов для распространения с исполняемым файлом. 'В идеале верно противоположное. Бинарные пакеты, например. Linux, очевидно, не носит и пытается установить дубликаты общих библиотек снова и снова. Они отмечают зависимость и обязывают пользователя их устанавливать. Даже если распределить с менеджером пакетов, часто можно предположить, что система пользователя уже будет иметь необходимые библиотеки, или пользователь может их приобрести. Это в основном Windows, которая часто делает так сложно, что мы предоставляем и распространяем все DLL. Который, э ... ... поражает точку динамической привязки –

Смежные вопросы