Difference between revisions of "Lazarus/FPC Libraries/ru"
(→Смотрите также: Updated) |
|||
(3 intermediate revisions by 2 users not shown) | |||
Line 20: | Line 20: | ||
!COLSPAN="1" STYLE="background:#ffdead;"|'''Динамическая библиотека''' | !COLSPAN="1" STYLE="background:#ffdead;"|'''Динамическая библиотека''' | ||
!COLSPAN="1" STYLE="background:#ffdead;"|'''Статичная библиотека''' | !COLSPAN="1" STYLE="background:#ffdead;"|'''Статичная библиотека''' | ||
+ | !COLSPAN="1" STYLE="background:#ffdead;"|''''''Префикс библиотеки''' | ||
|---- class="working" | |---- class="working" | ||
− | |FreeBSD||.so||.a | + | |FreeBSD||.so||.a || lib |
|---- class="working" | |---- class="working" | ||
− | | | + | |macOS||.dylib||.a || lib |
|---- class="working" | |---- class="working" | ||
− | |Linux||.so||.a | + | |Linux||.so||.a || lib |
|---- class="working" | |---- class="working" | ||
− | |Windows||.dll||.lib | + | |Windows||.dll||.lib || - |
+ | |---- class="working" | ||
+ | |Haiku||.so||.a||lib | ||
|} | |} | ||
===FreeBSD=== | ===FreeBSD=== | ||
− | === | + | ===macOS=== |
===Linux=== | ===Linux=== | ||
Line 75: | Line 78: | ||
==Смотрите также== | ==Смотрите также== | ||
+ | * [[macOS Programming Tips#Libraries|macOS Programming Tips - Libraries]] | ||
+ | * [[macOS Dynamic Libraries]] | ||
+ | * [[macOS Static Libraries]] | ||
* FPC [[shared library]] | * FPC [[shared library]] | ||
* FPC [[packages]] | * FPC [[packages]] | ||
− | + | * [[Translations / i18n / localizations for programs]] | |
− | |||
− | [[Translations / i18n / localizations for programs]] |
Latest revision as of 00:57, 24 September 2021
│
English (en) │
español (es) │
français (fr) │
日本語 (ja) │
русский (ru) │
Эта страница содержит информацию о том, как создавать библиотеки с помощью Lazarus/FPC и как использовать их в проектах и пакетах.
Схожие темы
- Creating bindings for C libraries - Как преобразовать заголовочные файлы языка C (с расширением .h) в модули на паскале.
Основное
Статическая компоновка: FPC по умолчанию компилирует и компонует статичные исполняемые файлы. Это значит, что компилятор дает команду компоновщику взять все объектные файлы (с расширением .о) в проекте и все пакеты, а затем собрать их в один большой исполняемый файл. Преимущества: нет внешних зависимостей. Недостатки: Разные программы на одном компьютере не могут использовать общий код, и вы не сможете загружать/выгружать подключаемые модули.
Динамические библиотеки: Идея динамических библиотек в том, чтобы разделять общий одинаковый код между программами, сохраняя таким образом память и сокращая время на запуск часто используемых библиотек и подключаемых модулей. Недостатками такого подхода являются снижение скорости редко используемых библиотек, сложное внутреннее устройство (это больше проблема для компилятора) и то, что инициализация раздельна (см. ниже) и требуется система версий, чтобы получить совместимый код.
Операционные системы
Динамические библиотеки:
Операционная система | Динамическая библиотека | Статичная библиотека | 'Префикс библиотеки |
---|---|---|---|
FreeBSD | .so | .a | lib |
macOS | .dylib | .a | lib |
Linux | .so | .a | lib |
Windows | .dll | .lib | - |
Haiku | .so | .a | lib |
FreeBSD
macOS
Linux
Имя файла динамической библиотеки всегда имеет вид 'lib+'имя'+'.so'+версия. Пример: libz.so.1 и libz.so.1.2.2. Linux ищет библиотеку в местах, путь к которым прописан в переменной окружения LD_LIBRARY_PATH, затем в /lib, /usr/lib и наконец в директориях, пути к которым прописаны в файле /etc/ld.so.conf.
Чтобы была возможность разделять память (использовать GetMem/FreeMem, строки, динамические массивы и т.д.) с другими библиотеками (написанными не в FPC) в Linux, необходимо в раздел uses главного файла проекта (обычно .lpr) добавить модуль cmem (нужно вписать его самым первым, до инициализации других модулей!).
Windows
Windows ищет библиотеку в текущей директории, затем системной директории и в переменной окружения PATH.
ppumove, .ppu, .ppl
FPC обычно создает для каждого модуля файлы с расширением .ppu и .o. файл .ppu содержит всю важную информацию из файла .pas/.pp (типы, требуемые объектные файлы .о), тогда как файл .о содержит ассемблерный код и измененные имена, понимаемые текущей системой. Инструмент ppumove, входящий в любую установку FPC, конвертирует файлы .ppu и .o в динамическую библиотеку. Это достигается засчет вызова компоновщика для сборки всех объектных файлов с расширением .о в файл с расширением .so (или .dll в Windows) с последующим удалением записей об объектных файлах из файла .ppu. Обычно такой новый .ppu файл переименовывается в .ppl. Пример: Перейдите в директорию с пакетом (ту, в которой находятся файлы .ppu): ppumove -o имя_пакета -e ppl *.ppu Эта команда конвертирует все файлы .ppu в .ppl и создаст файл libимя_пакета.so (в windows - имя_пакета.dll). Запомните, что в Linux префикс 'lib' добавляется всегда.
Эта новая библиотека может использоваться и другими языками программирования, например C или C++. Или в других программах FPC, с помощью использования external модификаторов. Но секции инициализации/финализации должны вызываться автоматически. Включая инициаллизацию/финализацию менеджера "кучи". Это означает, что не получится использовать строки или GetMem/FreeMem. Но программисты могут добиться большего какими-то своими способами.
Loadlibrary - загрузка динамической библиотеки
Загрузка динамической библиотеки проще с функцией dlopen Loadlibrary из модуля unit dl dynlibs.
С версии 1.9.4, dynlibs предоставляет портируемую альтернативу модулю dl. Запомните, что использование модуля dl вместо dynlibs обычно приводит к невозможности портирования между разными системами.
Главная проблема - получить имя файла, которое зависит от версии и операционной системы. С версии 2.2.2, в модуле dynlibs появилась константа sharedsuffix, которая упростит этот процесс. Она позволяет получить правильное расширение (dll/so/dylib).
Инициализация
Любой модуль содержит раздел инициализации. Порядок инициализации записан в разделе uses каждого модуля.
Как инициализировать динамическую библиотеку: в разработке...
Финализация
Каждый модуль содержит раздел финализации. Порядок обратный по отношению к порядку инициализации.
Версии, распространение
Библиотеки имеют тенденцию разрастаться и меняться постоянно. Добавление новых возможностей не будет проблемой, а вот удаление метода или изменение его параметров вызовет несовместимость разных версий библиотек. Это значит, любая установленная библиотека (.so, .dll, .dylib) замещается совместимой или новая бибиотека должна быть добавлена в систему. Поэтому каждая библиотека и содержит номер версии. Чтобы загрузить динамическую библиотеку (dlopen из unit dl), должно быть известно правильное имя файла. Под Linux это значит, что вы должны знать и номер версии (т.к. библиотеки оканчиваются на .so.номер_версии). В разработке: IDE сможет создавать номера версий.