Lazarus/FPC Libraries/fr

From Lazarus wiki
Jump to navigationJump to search

English (en) español (es) français (fr) 日本語 (ja) русский (ru)

Cette page décrit les possibilités de création de bibliothèques avec Lazarus/FPC et comment les utiliser dans les projets et les paquets .

Matières relatives

Généralités

Liaison statique: FPC compile et effectue les liens par défaut d'un executable statique. Cela signifie qu'il indique à l'éditeur de liens de mettre tous les fichiers .o du projet et tous les paquets dans un grand exécutable . Avantage : aucune dépendance externe . Inconvénient : Aucun code n'est partagé entre les différents programmes sur le même ordinateur. Et vous ne pouvez pas charger/décharger un plugin.

Librairies dynamiques: L'idée des bibliothèques dynamiques est partager le code entre les programmes, sauvegardant la mémoire du code , réduisant le temps de démarrage pour les bibliothèques souvent employées et permettant les plugins. Les inconvénients des bibliothèques dynamiques sont : elles sont plus lentes pour les bibliothèques rarement utilisées, leur structure et leur intérieur sont plus compliqués (c'est principalement un problème pour le compilateur), leur initialisation est différente (voir ci-dessous ) et partager du code exige une version de système pour mélanger seulement le code compatible .

Système d'exploitation

Bibliothèques dynamiques :

Système d'exploitation Bibliothèque dynamique Bibliothèque statique
FreeBSD .so .a
MacOSX .dylib ?
Linux .so .a
Windows .dll ?

FreeBSD

MacOSX

Linux

Un nom de fichier d'une bibliothèque dynamique a toujours la forme 'lib'+nom de paquet+'.so'+version. Par exemple : libz.so.1 and libz.so.1.2.2.

Linux recherche une bibliothèque dans les chemins de la variable d'environnement LD_LIBRARY_PATH, puis dans /lib, puis /usr/lib et finalement les chemins de /etc/ld.so.conf.

Pour partager de la mémoire (Chaînes GetMem/FreeMem) avec d'autres bibliothèques (non écrite en FPC) sous Linux vous devriez employer l'unité cmem. Cette unité doit être ajoutée comme la toute première unité dans la section uses du fichier source du projet principal (typiquement .lpr), de sorte que sa section d'initialisation soit appellée avant que n'importe quelle autre unité puisse assigner la mémoire .

Windows

Windows recherche une bibliothèque dans le répertoire courant, le répertoire system et la variable d'environnement PATH.

ppumove, .ppu, .ppl

FPC crée normalement pour chaque unité un fichier .ppu et un fichier .o. Le fichier .ppu contient chaque information importante du fichier .pas/.pp (les types, les noms de fichier requis comme le fichier .o), tandis que le fichier .o contient le code assembleur et les noms mutilés compris par le système courant .

L'outil ppumove inclus avec chaque installation FPC , convertis un ou plusieurs fichiers .ppu et .o dans une bibliothèque dynamique. Il fait ceci en appelant l'éditeur de liens pour recueillir tous les fichier .o dans a un fichier .so (pour windows: .ddl) et enlève les références au nom de fichier .o depuis le fichier .ppu. Ces nouveaux fichiers .ppu s'appellent normalement les fichiers .ppl.

Par exemple :

Vous avez le répertoire de sortie d'un paquet (où les fichiers .ppu sont):

 ppumove -o packagename -e ppl *.ppu

Ceci convertira tous les fichiers .ppu en fichiers .ppl et créera un fichier libpackagename.so (pour windows: packagename.dll). Noter que sous Linux le préfixe 'lib' est toujours ajouté au début.

Cette nouvelle bibliothèque peut déjà être employée par d'autres langages de programmation comme C. Ou par des programmes FPC en employant les modificateurs externe. Mais les sections initialization/finalization doivent être appelées automatiquement . Ceci inclut le sections initialization/finalization du gestionnaire du tas. Ceci signifie aucune chaîne ou GetMem. Naturellement les programmeurs FPC sont spoilés et ils peuvent obtenir plus .

dlopen - chargement d'une bibliothèque dynamique

Charger une bibliothèque dynamique est simple avec la fonction dlopen de l'unité dl.

ToDo: donner un exemple

Le problème principal est d'obtenir le nom de fichier , qui dépend de la version et du système d'exploitation.

Initialization

Every unit can contain an initialization section. The order of the initialization sections depend on the uses sections of each unit.

How to initialize a dynamic library: ToDo

Finalization

Every unit can contain an finalization section. The order is the reverse order of the initialization sections.

Versions, Distribution

Libraries tend to grow and change over time. Adding new features is no problem, but removing a public method or changing its parameters makes the library incompatible. That means either an installed library (.so, .dll, .dylib) is replaced by a compatible one or a new library must be added to the system. That's why every library contains a version.

To load a dynamic library (dlopen of unit dl) the correct filename must be known. Under Linux this means, you have to know the version number.

ToDo: proposal how the IDE should create version numbers