Lazarus/FPC Libraries/ru

From Free Pascal wiki
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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 сможет создавать номера версий.

Смотрите также