разделяемые и статические библиотеки - PullRequest
0 голосов
/ 24 июня 2011

Может кто-нибудь объяснить мне, в чем разница между разделяемой и статической библиотекой в ​​gcc (makefile)

Я прочитал, что статическая библиотека - это независимый код, но он увеличивает размер вашего исполняемого файла

Но хотя разделяемая библиотека динамически связывает функции и не увеличивает размер вашего исполняемого файла

Я не могу понять разницу между этими двумя.

Может кто-нибудь сказать мне, когда я долженсоздать статическую библиотеку, и когда я должен создать общую библиотеку.

Они говорят, что общая библиотека является позиционно-зависимым кодом

Что мы подразумеваем под позиционно-зависимым кодом?

Еслиразделяемая библиотека не увеличивает код, и если статическая библиотека увеличивает размер кода, тогда мы можем просто выбрать правильную разделяемую библиотеку.

Но почему у нас тоже есть статическая библиотека, для чего она в действительности используется?

пожалуйста, помогите мне, ребята

Ответы [ 2 ]

2 голосов
/ 25 июня 2011

Когда вы компилируете код с помощью gcc, он может напрямую создавать объектные файлы, и несколько объектных файлов могут быть связаны вместе для создания исполняемого файла.

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

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

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

Связывание с динамической библиотекой означает, что компоновщик разрешает символы только в конечном исполняемом файле,но не добавляет ни один объектный код из библиотеки во время соединения.

Запуск исполняемого файла, связанного с динамическими библиотеками, означает, что во время выполнения некоторое специальное программное обеспечение должно запрашивать загрузку операционной системыуказанная динамическая библиотека в память (именно поэтому динамическая библиотека должна создаваться компоновщиком) обычно до того, как программа получает main().

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

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

Если вы отправите исполняемый файл, которому нужна динамическая библиотека, то вам может повезти и файлможет быть уже на компьютере пользователя.Если нет, то вам придется установить и это.Однако, если вы обнаружите ошибки в своей библиотеке, то просто отправив новую версию , ваша динамическая библиотека исправит ошибки.

Исполняемый файл, созданный из статических библиотек, готов к работе, но исправляетошибки могут включать пересылку всего исполняемого файла.

В заключение:

               object files  static library  dynamic library
produced by    compiler      librarian       linker
exe            large         smaller         smallest
ram x 1 copy   large         smaller         largest
ram x n copies large         smaller         smallest
dep on files   independent   independent     dependant
upgrade lib    no            no              yes
0 голосов
/ 24 июня 2011
  • Возможно, вы захотите создать один исполняемый файл без зависимостей библиотек.
  • Насколько я знаю, статические библиотеки должны быть несколько быстрее.

Недостатки: связывание разделяемых библиотек не только увеличивает размер исполняемого файла, но и загружается с каждым исполняемым файлом. Если вы используете библиотеку в нескольких исполняемых файлах, она будет находиться в памяти несколько раз.

Позиционно-зависимый код означает, что при создании библиотеки точное местоположение в памяти библиотеки неизвестно, поэтому доступна только относительная адресация памяти (например: перейти к +50 байтам из этой инструкции и оттуда выполнить выполнение)

...