Lazarus/FPC Libraries/ru: what changed
Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.
| Old | New | Line | |
|---|---|---|---|
| 1 | 1 | Эта страница содержит информацию о том, как создавать библиотеки с помощью Lazarus/FPC и как использовать их в проектах и пакетах. | |
| 2 | 2 | ||
| 3 | 3 | ## Схожие темы | |
| 4 | 4 | ||
| 5 | 5 | - [[Creating bindings for C libraries]] - Как преобразовать заголовочные файлы языка C (с расширением .h) в модули на паскале. | |
| 6 | 6 | ||
| 7 | 7 | ## Основное | |
| 8 | 8 | ||
| 9 | 9 | Статическая компоновка: FPC по умолчанию компилирует и компонует статичные исполняемые файлы. Это значит, что компилятор дает команду компоновщику взять все объектные файлы (с расширением .о) в проекте и все пакеты, а затем собрать их в один большой исполняемый файл. Преимущества: нет внешних зависимостей. Недостатки: Разные программы на одном компьютере не могут использовать общий код, и вы не сможете загружать/выгружать подключаемые модули. | |
| 10 | 10 | ||
| 11 | 11 | Динамические библиотеки: Идея динамических библиотек в том, чтобы разделять общий одинаковый код между программами, сохраняя таким образом память и сокращая время на запуск часто используемых библиотек и подключаемых модулей. Недостатками такого подхода являются снижение скорости редко используемых библиотек, сложное внутреннее устройство (это больше проблема для компилятора) и то, что инициализация раздельна (см. ниже) и требуется система версий, чтобы получить совместимый код. | |
| 12 | 12 | ||
| 13 | 13 | ## Операционные системы | |
| 14 | 14 | ||
| 15 | 15 | Динамические библиотеки: | |
| 16 | 16 | ||
| 17 | 17 | | **Операционная система** | **Динамическая библиотека** | **Статичная библиотека** | ''**'Префикс библиотеки** | | |
| 18 | 18 | |----|----|----|----| | |
| 19 | 19 | | FreeBSD | .so | .a | lib | | |
| 20 | 20 | | macOS | .dylib | .a | lib | | |
| 21 | 21 | | Linux | .so | .a | lib | | |
| 22 | 22 | | Windows | .dll | .lib | \- | | |
| 23 | 23 | | Haiku | .so | .a | lib | | |
| 24 | 24 | ||
| 25 | 25 | ### FreeBSD | |
| 26 | 26 | ||
| 27 | 27 | ### macOS | |
| 28 | 28 | ||
| 29 | 29 | ### Linux | |
| 30 | 30 | ||
| 31 | 31 | Имя файла динамической библиотеки всегда имеет вид 'lib+'имя'+'.so'+версия. Пример: libz.so.1 и libz.so.1.2.2. Linux ищет библиотеку в местах, путь к которым прописан в переменной окружения LD_LIBRARY_PATH, затем в /lib, /usr/lib и наконец в директориях, пути к которым прописаны в файле /etc/ld.so.conf. | |
| 32 | 32 | ||
| 33 | 33 | Чтобы была возможность разделять память (использовать GetMem/FreeMem, строки, динамические массивы и т.д.) с другими библиотеками (написанными не в FPC) в Linux, необходимо в раздел uses главного файла проекта (обычно .lpr) добавить модуль cmem (**нужно вписать его самым первым, до инициализации других модулей!**). | |
| 34 | 34 | ||
| 35 | 35 | ### Windows | |
| 36 | 36 | ||
| 37 | 37 | Windows ищет библиотеку в текущей директории, затем системной директории и в переменной окружения PATH. | |
| 38 | 38 | ||
| 39 | 39 | ## ppumove, .ppu, .ppl | |
| 40 | 40 | ||
| 41 | 41 | 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' добавляется всегда. | |
| 42 | 42 | ||
| 43 | 43 | Эта новая библиотека может использоваться и другими языками программирования, например C или C++. Или в других программах FPC, с помощью использования **external** модификаторов. Но секции инициализации/финализации должны вызываться автоматически. Включая инициаллизацию/финализацию менеджера "кучи". Это означает, что не получится использовать строки или GetMem/FreeMem. Но программисты могут добиться большего какими-то своими способами. | |
| 44 | 44 | ||
| 45 | 45 | ## Loadlibrary - загрузка динамической библиотеки | |
| 46 | 46 | ||
| 47 | - | ||
| 47 | + | Загрузка динамической библиотеки проще с функцией dlopen Loadlibrary из модуля unit dl dynlibs. С версии 1.9.4, dynlibs предоставляет портируемую альтернативу модулю dl. Запомните, что использование модуля dl вместо dynlibs обычно приводит к невозможности портирования между разными системами. Главная проблема - получить имя файла, которое зависит от версии и операционной системы. С версии 2.2.2, в модуле dynlibs появилась константа sharedsuffix, которая упростит этот процесс. Она позволяет получить правильное расширение (dll/so/dylib). | |
| 48 | 48 | ||
| 49 | 49 | ## Инициализация | |
| 50 | 50 | ||
| 51 | 51 | Любой модуль содержит раздел инициализации. Порядок инициализации записан в разделе uses каждого модуля. | |
| 52 | 52 | ||
| 53 | 53 | Как инициализировать динамическую библиотеку: в разработке... | |
| 54 | 54 | ||
| 55 | 55 | ## Финализация | |
| 56 | 56 | ||
| 57 | 57 | Каждый модуль содержит раздел финализации. Порядок обратный по отношению к порядку инициализации. | |
| 58 | 58 | ||
| 59 | 59 | ## Версии, распространение | |
| 60 | 60 | ||
| 61 | 61 | Библиотеки имеют тенденцию разрастаться и меняться постоянно. Добавление новых возможностей не будет проблемой, а вот удаление метода или изменение его параметров вызовет несовместимость разных версий библиотек. Это значит, любая установленная библиотека (.so, .dll, .dylib) замещается совместимой **или** новая бибиотека должна быть добавлена в систему. Поэтому каждая библиотека и содержит номер версии. Чтобы загрузить динамическую библиотеку (**dlopen** из **unit dl**), должно быть известно правильное имя файла. Под Linux это значит, что вы должны знать и номер версии (т.к. библиотеки оканчиваются на .so.номер_версии). В разработке: IDE сможет создавать номера версий. | |
| 62 | 62 | ||
| 63 | 63 | ## Смотрите также | |
| 64 | 64 | ||
| 65 | 65 | - [[macOS Programming Tips|macOS Programming Tips - Libraries]] | |
| 66 | 66 | - [[macOS Dynamic Libraries]] | |
| 67 | 67 | - [[macOS Static Libraries]] | |
| 68 | 68 | - FPC [[shared library]] | |
| 69 | 69 | - FPC [[packages]] | |
| 70 | 70 | - [[Translations / i18n / localizations for programs]] | |
| 71 | 71 | ||
| 72 | 72 | --- | |
| 73 | 73 | *From the Free Pascal wiki, page "Lazarus/FPC Libraries/ru", as it stood on 2021-09-23 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* |
