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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

.so - файлы разделяемой библиотеки. .a - файлы статической библиотеки.

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

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

Ответ 3

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

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