Lazarus-FPC библиотеки-en
Тази страница съдържа информация как да създавате библиотеки с Lazarus/FPC и как да ги използвате в проекти и пакети.
Свързани теми
- Създаване на обвързвания за C библиотеки - Как да конвертирате C заглавни файлове (с разширение .h) в Pascal модули.
Статично свързване: FPC компилира и свързва статични двоични файлове по подразбиране. Това означава, че компилаторът инструктира линкера да вземе всички обектни файлове (с разширение .o) в проекта и всички пакети и след това да ги сглоби в един голям изпълним файл. Предимства: няма външни зависимости. Недостатъци: Различни програми на един и същ компютър не могат да споделят код и няма да можете да зареждате/разтоварвате добавки.
Динамични библиотеки: Идеята на динамичните библиотеки е да споделят един и същ общ код между програмите, като по този начин пестят памет и намаляват времето за изпълнение на често използвани библиотеки и добавки. Недостатъците на този подход са намаляване на скоростта за рядко използвани библиотеки, сложни вътрешни елементи (по-скоро проблем за компилатора) и факта, че инициализацията е отделна (вижте по-долу) и е необходима версия на системата, за да получите съвместим код.
операционна система
FreeBSD | .така | .а |
MacOSX | .dylib | .а |
linux | .така | .а |
Windows | .dll | .lib |
Името на файл с динамична библиотека винаги е 'lib+'name'+'.so'+version. Пример: libz.so.1 и libz.so.1.2.2. Linux търси библиотека на места, чийто път е посочен в променливасреда LD_LIBRARY_PATH, след това към /lib, /usr/lib и накрая към директориите, чиито пътища са посочени във файла /etc/ld.so.conf.
За да можете да споделяте памет (използвайте GetMem/FreeMem, низове, динамични масиви и т.н.) с други библиотеки (написани не на FPC) в Linux, трябва да добавите модула cmem към раздела за използване на основния файл на проекта (обикновено .lpr) (трябва да го въведете първо, преди да инициализирате други модули!).
Windows търси библиотеката в текущата директория, след това в системната директория и в променливата на средата PATH.
ppumove, .ppu, .ppl
FPC обикновено създава .ppu и .o файлове за всеки модул. Файлът.ppuсъдържа цялата важна информация от файла .pas/.pp (типове, необходими .o обектни файлове), докато файлът.oсъдържа асемблерния код и модифицираните имена, разбираеми от текущата система. Инструментътppumove, включен във всяка инсталация на FPC, преобразува .ppu и .o файлове в библиотека с динамични връзки. Това се постига чрез извикване на линкера за сглобяване на всички .o обектни файлове в .so файл (или .dll в Windows) и след това премахване на записите в обектния файл от .ppu файла. Обикновено такъв нов .ppu файл се преименува на.ppl. Пример: Променете към директорията на пакета (тази с .ppu файловете): ppumove -o packagename -e ppl *.ppu Тази команда ще конвертира всички .ppu файлове в .ppl и ще създаде файла libpackagename.so (на Windows, packagename.dll). Имайте предвид, че на Linux префиксът 'lib' винаги се добавя.
Тази нова библиотека може да се използва и от други езици за програмиране, като C или C++. Или в други FPC програми, като използватевъншнимодификатори. Но секциите за инициализация/финализиране трябва да бъдат извиканиавтоматично. Включително инициализация/финализиране на диспечер на купчина. Това означава, че не можете да използвате низове или GetMem/FreeMem. Но програмистите могат да постигнат повече по свои начини.
Loadlibrary - зареждане на динамична библиотека
Зареждането на динамична библиотека е по-лесно с функцията dlopen Loadlibrary от модула dl dynlibs. От версия 1.9.4 dynlibs предоставя преносима алтернатива на dl модула. Имайте предвид, че използването на dl модула вместо dynlibs обикновено води до невъзможност за пренасяне между различни системи. Основният проблем е получаването на името на файла, което зависи от версията и операционната система. От версия 2.2.2 константата sharedsuffix се появи в модула dynlibs, което ще опрости този процес. Позволява ви да получите правилното разширение (dll/so/dylib).
Инициализация
Всеки модул съдържа раздел за инициализация. Редът на инициализация се записва в секцията за използване на всеки модул.
Как да инициализирате динамична библиотека: в процес на разработка.
Финализиране
Всеки модул съдържа секция за финализиране. Редът е обратен на реда на инициализация.
Версии, разпространение
Библиотеките са склонни да растат и да се променят постоянно. Добавянето на нови функции няма да е проблем, но изтриването на метод или промяната на неговите параметри ще доведе до несъвместимост между различните версии на библиотеките. Това означава, че всяка инсталирана библиотека (.so, .dll, .dylib) е заменена със съвместимаилинова библиотека трябва да бъде добавена към системата. Следователно всяка библиотека съдържа номер на версия. За да заредите динамична библиотека (dlopenотunit dl), трябва да се знае правилното име на файл. Под Linux това означава, че трябва да знаете и номера на версията (защото библиотеките завършват на.so.номер_на_версия). В процес на разработка: IDE ще може да генерира номера на версиите.