Статические библиотеки — это просто набор обычных объектных файлов; обычно статические библиотеки заканчиваются суффиксом «а». Эта коллекция создается с помощью программы ar (архиватор). Статические библиотеки используются не так часто, как раньше, из-за преимуществ разделяемых библиотек (описанных ниже). Тем не менее, они иногда создаются, они существовали сначала исторически, и их проще объяснить.
Статические библиотеки позволяют пользователям связываться с программами без перекомпиляции их кода, что экономит время перекомпиляции. Обратите внимание, что время перекомпиляции менее важно, учитывая современные более быстрые компиляторы, поэтому эта причина не так сильна, как раньше. Статические библиотеки часто бывают полезны для разработчиков, если они хотят разрешить программистам ссылаться на свою библиотеку, но не хотят предоставлять исходный код библиотеки (что является преимуществом для поставщика библиотеки, но явно не преимуществом для программиста, пытающегося пользоваться библиотекой). Теоретически код в статических библиотеках ELF, который связан с исполняемым файлом, должен работать немного быстрее (на 1–5%), чем в разделяемой библиотеке или в динамически загружаемой библиотеке, но на практике это происходит редко из-за других искажающих факторов. .
Как использовать и создавать статические библиотеки?
Чтобы создать статическую библиотеку или добавить дополнительные объектные файлы в существующую статическую библиотеку, используйте следующую команду:
ar rcs my_library.a file1.o file2.o
Этот пример команды добавляет объектные файлы file1.o и file2.o в статическую библиотеку my_library.a, создавая my_library.a, если она еще не существует. Для получения дополнительной информации о создании статических библиотек см. ar.
Создав статическую библиотеку, вы захотите ее использовать. Вы можете использовать статическую библиотеку, вызывая ее как часть процесса компиляции и компоновки при создании исполняемого файла программы. Если вы используете gcc для создания исполняемого файла, вы можете использовать параметр -l для указания библиотеки; см. информацию: gcc для получения дополнительной информации.
Будьте осторожны с порядком параметров при использовании gcc; параметр -l является параметром компоновщика, поэтому его необходимо размещать ПОСЛЕ имени компилируемого файла. Это сильно отличается от обычного синтаксиса опций. Если вы поместите опцию -l перед именем файла, он может вообще не связаться, и вы можете получить загадочные ошибки.
Для статической библиотеки фактический код извлекается компоновщиком из библиотеки и используется для сборки окончательного исполняемого файла в момент компиляции/сборки приложения.
Каждый процесс получает свою собственную копию кода и данных. В то время как в случае динамических библиотек это только общий код, данные специфичны для каждого процесса. Для статических библиотек требуется больше памяти. Например, если бы все инструменты оконной системы были статически связаны, несколько десятков мегабайт ОЗУ были бы потрачены впустую для обычного пользователя, а пользователь был бы замедлен из-за большого количества подкачек.
Поскольку код библиотеки подключается во время компиляции, окончательный исполняемый файл не зависит от библиотеки во время выполнения, т. е. никаких дополнительных затрат на загрузку во время выполнения, это означает, что вам не нужно носить с собой копию библиотеки, которая создается. используется и у вас все под вашим контролем и нет никакой зависимости.
В статических библиотеках, когда все включено в ваше приложение, вам не нужно беспокоиться о том, что у клиента будет правильная библиотека (и версия), доступная в его системе.
Одним из недостатков статических библиотек является то, что для любого изменения (обновления) в статических библиотеках вам необходимо каждый раз перекомпилировать основную программу.
Одним из основных преимуществ статических библиотек, которым отдают предпочтение даже сейчас, является «скорость». В статических библиотеках не будет динамических запросов символов. Даже сегодня во многих производственных программах используются статические библиотеки.