Я знаю .o являются объектными файлами, .a являются статическими библиотеками и .so являются динамическими библиотеками? Каково их физическое значение? Когда я могу использовать некоторые, а когда нет?В чем разница между файлами .o .a и .so?
ответ
.so являются файлами общей библиотеки. .a - файлы статической библиотеки.
Вы можете статически ссылаться на .a библиотеки и динамически связывать и загружать в исполняемые файлы .so, если вы компилируете и связываете этот путь.
.o являются объектные файлы (они компилируются из * .c файлов и могут быть связаны для создания исполняемых файлов, .a или .so библиотеки. Подробнее об этом here
Не существует ли способ загрузки .a библиотек во время выполнения? – Pacerier
.a
является «архив». Несмотря на то, архив может содержать любой тип файла, в контексте инструментальной цепочки GNU, это библиотека объектных файлов (другие инструментальные цепочки, особенно на WIndows, используют .lib
с той же целью, но формат их обычно не является архивом общего назначения, и часто специфичны для инструментальной цепочки). Можно извлечь отдельные объектные файлы из архива, который по существу является тем, что делает компоновщик, когда он использует библиотеку.
.o
- это файл объекта. Это код, который скомпилирован в машинный код, но не (как правило) полностью связан - он может иметь неразрешенные ссылки на символы, определенные в других объектных файлах (в библиотеке или отдельно), сгенерированные отдельной компиляцией. Файлы объектов содержат метаданные для поддержки связывания с другими модулями и, необязательно, также для символической отладки исходного уровня (например, в GDB). Другие инструментальные средства, как правило, в Windows, используют расширение .obj
, а не .o
.
.so
- это общая библиотека объектов (или только разделяемая библиотека). Это динамически связано с исполняемым файлом, когда программа запускается, а не статически связана во время сборки. Он позволяет выполнять меньшие исполняемые файлы, а один экземпляр библиотеки объектов используется несколькими исполняемыми файлами. API-интерфейсы операционной системы обычно являются совместно используемыми библиотеками, и они часто используются также в GNU по причинам лицензирования, чтобы отделить код LGPL от закрытого исходного кода (например, я не юрист). Я не претендую на легитимность этого подхода в любая конкретная ситуация). В отличие от .o
или .a
файлов, .so
файлы, используемые приложением, должны быть доступны в системе исполнения. Другие системы (опять же обычно Windows) используют .dll
(динамическая библиотека ссылок) для этой же цели.
Это, пожалуй, полезно понять, что .o
файлы связаны перед объектный код в .a
файлы таким образом, что если разрешение символ удовлетворяется .o
файла, любая реализация библиотеки не будет связана - что позволяет существенно заменить библиотеку реализаций со своими собственными, а также для реализации библиотек для вызова пользовательского кода - например, инфраструктура графического интерфейса может вызывать точку входа приложения.
Что касается «* .o файлов связаны перед объектным кодом в .a *", вы имеете в виду, что это происходит независимо от того, какой заказ вы указали? – Pacerier
Статические библиотеки - это архивы, которые содержат объектный код для библиотеки, при соединении с приложением, что код скомпилирован в исполняемый файл.
Общие библиотеки отличаются тем, что они не скомпилированы в исполняемый файл. Вместо этого динамический компоновщик ищет в некоторых каталогах нужные библиотеки, а затем загружает их в память. Одновременно один исполняемый файл может использовать одну и ту же разделяемую библиотеку, тем самым уменьшая объем использования памяти и размер исполняемого файла. Тем не менее, есть еще больше файлов для распространения с исполняемым файлом. Вы должны убедиться, что библиотека установлена в систему пользователя где-нибудь, где линкер может ее найти, статическая привязка устраняет эту проблему, но приводит к большему исполняемому файлу.
'Тем не менее, тогда есть больше файлов для распространения с исполняемым файлом. 'В идеале верно противоположное. Бинарные пакеты, например. Linux, очевидно, не носит и пытается установить дубликаты общих библиотек снова и снова. Они отмечают зависимость и обязывают пользователя их устанавливать. Даже если распределить с менеджером пакетов, часто можно предположить, что система пользователя уже будет иметь необходимые библиотеки, или пользователь может их приобрести. Это в основном Windows, которая часто делает так сложно, что мы предоставляем и распространяем все DLL. Который, э ... ... поражает точку динамической привязки –
- 1. В чем разница между .lib и .a файлами?
- 2. разница между .so.0 и .so.0.0.0 файлами
- 3. В чем разница между .so.3.0 и .so в opencv?
- 4. В чем разница между `* a =` и `= * a`?
- 5. В чем разница между «a» и «a»?
- 6. В чем разница между .sl и .so на HPUX?
- 7. В чем разница между A a; и A a() ;?
- 8. В чем разница между списком (a) и [a]?
- 9. В чем разница между * (a + b) и (* a + b)
- 10. crt0.o и crt1.o - В чем разница?
- 11. В чем разница между файлами ELF и файлами bin?
- 12. В чем разница между 'a и' _l?
- 13. В чем разница между ++ и a + 1?
- 14. Разница между .so и .so.x
- 15. В чем разница между a = a + b и a + = b?
- 16. В чем разница между A и A [] в параметре функции?
- 17. В чем разница между «a» и «a» в SML?
- 18. В чем разница между * a и ** a в объекте-c?
- 19. CMake добавляет ненужные зависимости между .o и .a файлами
- 20. В чем разница между объектным файлом .o и файлом библиотеки .so?
- 21. В чем разница между var a = {} и var a = function() {}
- 22. В чем разница между целым числом a и * (& a)?
- 23. В чем разница между if ($ a) и if ($ a == 1)?
- 24. В чем разница между is-a и has-a?
- 25. В чем разница между static int a и int a?
- 26. В чем разница между $ a == 2 и 2 == $ a?
- 27. В чем разница между «numpy.add (a, b)» и «a + b»?
- 28. В чем разница между .so и файлом .lo?
- 29. В чем разница между статическими файлами и медиафайлами в Django?
- 30. В чем разница между .o и .os objs в glibc
Почему это связано с Java? – JonK