Lazarus/FPC Libraries/fr

From Free Pascal wiki

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

Chaque unité peut contenir une section d'initialisation . L'ordre des sections d'initialisation dépend des section de chaque unité .

Comment initialiser une bibliothèque dynamique : ToDo

Finalization

Chaque unité peut contenir une section finalization. L'ordre est l'ordre inverse des sections initialization.

Versions, Distribution

Les bibliothèques tendent à se développer et changent au cours du temps. Ajouter de nouvelles fonctionnalités n'est pas un problème , mais enlever une méthode publique ou changer ses paramètres rend la bibliothèque incompatible . Cela siginifie soit une bibliothèque installée (.so, .dll, .dylib) est remplacée par une autre compatible soit une nouvelle bibliothèque doit être ajoutée au système . C'est pourquoi chaque bibliothèque contient une version .

Pour charger une bibliothèque dynamique (dlopen de l'unité dl) le nom de fichier correct doit être connu . Sous Linux ceci signifie , vous devez savoir le numéro de version .

ToDo: proposer comment l'IDE devrait créer des numeros de version