Difference between revisions of "Lazarus/FPC Libraries/fr"

From Lazarus wiki
Jump to navigationJump to search
(→‎Système d'exploitation: Update table; add library prefix column)
 
(7 intermediate revisions by one other user not shown)
Line 21: Line 21:
 
!COLSPAN="1" STYLE="background:#ffdead;"|'''Bibliothèque dynamique '''
 
!COLSPAN="1" STYLE="background:#ffdead;"|'''Bibliothèque dynamique '''
 
!COLSPAN="1" STYLE="background:#ffdead;"|'''Bibliothèque statique '''
 
!COLSPAN="1" STYLE="background:#ffdead;"|'''Bibliothèque statique '''
 +
!COLSPAN="1" STYLE="background:#ffdead;"|'''Prefix de la bibliothèque'''
 
|---- class="working"
 
|---- class="working"
|FreeBSD||.so||.a
+
|FreeBSD||.so||.a || lib
 
|---- class="working"
 
|---- class="working"
|MacOSX||.dylib||?
+
|macOS||.dylib|| .a || lib
 
|---- class="working"
 
|---- class="working"
|Linux||.so||.a
+
|Linux||.so||.a || lib
 
|---- class="working"
 
|---- class="working"
|Windows||.dll||?
+
|Windows||.dll|| .lib || -
 +
|---- class="working"
 +
|Haiku||.so || .a || lib
 
|}
 
|}
  
 
===FreeBSD===
 
===FreeBSD===
  
===MacOSX===
+
===macOS===
  
 
===Linux===
 
===Linux===
  
A dynamic library filename has always the form 'lib'+packagename+'.so'+version. For example: libz.so.1 and libz.so.1.2.2.
+
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 searches a library in the paths of the environment variable LD_LIBRARY_PATH, then in /lib, then /usr/lib and finally the paths of /etc/ld.so.conf.
+
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.
  
To share memory (GetMem/FreeMem, strings) with other libraries (not written in FPC) under Linux you should use the '''unit cmem'''. This unit must be added as '''the very first unit in the uses section''' of the project main source file (typically .lpr), so that its initialization section is called before any other unit can allocate memory.
+
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===
  
Windows searches a library in the current directory, the system directory and the environment variable PATH.
+
Windows recherche une bibliothèque dans le répertoire courant, le répertoire system et la variable d'environnement PATH.
  
 
==ppumove, .ppu, .ppl==
 
==ppumove, .ppu, .ppl==
  
FPC normally creates for every unit a .ppu and .o file. The '''.ppu file''' contains every important information of the .pas/.pp file (types, required filenames like the .o file), while the '''.o file''' contains the assembler code and the mangled names understood by the current system.
+
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 .
  
The '''ppumove''' tool included with every FPC installation, converts one or several .ppu and .o files into a dynamic library. It does this by calling the linker to gather all .o files into a .so (windows: .ddl) file and removes the .o filename references from the .ppu file. These new .ppu files are normally called '''.ppl files'''.
+
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'''.
  
For example:
+
Par exemple :
  
You have the output directory of a package (where the .ppu files are):
+
Vous avez le répertoire de sortie d'un paquet (où les fichiers .ppu sont):
  
 
   ppumove -o packagename -e ppl *.ppu
 
   ppumove -o packagename -e ppl *.ppu
  
This will convert all .ppu files into .ppl files and creates a libpackagename.so (windows: packagename.dll). Note that under Linux the prefix 'lib' is always prepended.
+
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.
  
This new library can already be used by other programming languages like C. Or by FPC programs by using the '''external''' modifiers. But the initialization/finalization sections must be called automatically. This includes the initialization/finalization of the heap manager. This means no strings or GetMem. Of course FPC programmers are spoiled and they can get more.
+
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 - loading a dynamic library==
+
==dlopen - chargement d'une bibliothèque dynamique ==
  
Loading a dynamic library is simple with the '''dlopen''' function of the '''unit dl'''.
+
Charger une bibliothèque dynamique est simple avec la fonction '''dlopen''' de '''l'unité dl'''.
  
ToDo: give an example
+
ToDo: donner un exemple
  
The main problem is to get the filename, which depends on the version and the operating system.
+
Le problème principal est d'obtenir le nom de fichier , qui dépend de la version et du système d'exploitation.
  
 
==Initialization==
 
==Initialization==
  
Every unit can contain an initialization section. The order of the initialization sections depend on the uses sections of each unit.
+
Chaque unité peut contenir une section d'initialisation . L'ordre des sections d'initialisation dépend des section de chaque unité .
  
How to initialize a dynamic library: ToDo
+
Comment initialiser une bibliothèque dynamique : ToDo
  
 
==Finalization==
 
==Finalization==
  
Every unit can contain an finalization section. The order is the reverse order of the initialization sections.
+
Chaque unité peut contenir une section finalization. L'ordre est l'ordre inverse des sections initialization.
  
 
==Versions, Distribution==
 
==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.
+
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 .
  
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.
+
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: proposal how the IDE should create version numbers
+
ToDo: proposer comment l'IDE devrait créer des numeros de version

Latest revision as of 23:55, 23 September 2021

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 Prefix de la bibliothèque
FreeBSD .so .a lib
macOS .dylib .a lib
Linux .so .a lib
Windows .dll .lib -
Haiku .so .a lib

FreeBSD

macOS

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