Utilisation de la directive de packaging faible

De RAD Studio
Aller à : navigation, rechercher

Remonter à Compilation de packages


Dans Delphi :

La directive $WEAKPACKAGEUNIT affecte la manière dont un fichier .dcu est stocké dans les fichiers .dcp et .bpl d'un package. (Pour des informations sur les fichiers générés par le compilateur, voir Packages et DLL standard.) Si {$WEAKPACKAGEUNIT ON} apparaît dans un fichier unité, le compilateur omet l'unité des bpl lorsque cela est possible, et crée une copie locale "non packagée" lorsque cela est requis par une autre application ou un autre package. Une unité compilée avec cette directive est dite faiblement packagée.

Si, par exemple, vous créez un package appelé pack1 ne contenant que l'unité unit1. Supposez que unit1 n'utilise aucune unité supplémentaire, mais fait des appels à rare.dll. Si vous placez la directive {$WEAKPACKAGEUNIT ON} dans unit1.pas (Delphi) ou unit1.cpp (C++), lors de la compilation de votre package, unit1 n'est pas incluse dans pack1.bpl ; vous n'avez donc pas à distribuer de copie de rare.dll avec pack1. Toutefois, unit1 sera toujours incluse dans pack1.dcp. Si unit1 est référencée par un autre package ou application utilisant pack1, celle-ci sera copiée à partir de pack1.dcp et compilée directement dans le projet.

Supposons maintenant que vous ajoutiez à pack1 une deuxième unité, unit2. Supposons que unit2 utilise unit1. Cette fois, même si vous compilez pack1 avec {$WEAKPACKAGEUNIT ON} dans unit1.pas, le compilateur inclut unit1 dans pack1.bpl. Toutefois, les autres packages ou applications faisant référence à unit1 utiliseront la copie (non packagée) prise dans pack1.dcp.

Remarque : Les fichiers unité contenant la directive {$WEAKPACKAGEUNIT ON} ne doivent pas contenir de variables globales, de sections d'initialisation ou de sections de finalisation.

La directive {$WEAKPACKAGEUNIT ON} est une fonctionnalité avancée à l'intention des développeurs distribuant leurs packages à d'autres programmeurs. Elle vous permet d'éviter la distribution de DLL rarement utilisées et supprime les conflits entre des packages qui peuvent dépendre de la même bibliothèque externe.

Ainsi, l'unité PenWin référence PenWin.dll. La plupart des projets n'utilisent pas PenWin et la plupart des ordinateurs n'ont pas de fichier PenWin.dll installé. C'est pour cela que l'unité PenWin est faiblement packagée dans vcl. Lorsque vous compilez un projet utilisant PenWin et le package vcl, PenWin est copiée depuis vcl70.dcp et liée directement dans votre projet ; l'exécutable résultant est statiquement lié à PenWin.dll.

Si PenWin n'avait pas été faiblement packagée, deux problèmes se seraient produits. Tout d'abord, il aurait fallu que vcl soit lié de manière statique à PenWin.dll et vous n'auriez donc pas pu le charger sur un système ne disposant pas de PenWin.dll. De plus, si vous tentez de créer un package contenant PenWin, une erreur de compilation aurait lieu, puisque l'unité PenWin serait contenue dans vcl et dans votre package. Ainsi, sans "packaging faible", l'unité PenWin n'aurait pas pu être incluse dans les distributions standard de vcl.

Dans C++Builder :

La directive #pragma package(smart_init, weak) affecte la manière dont un fichier .obj est stocké dans les fichiers .bpi et .bpl d'un package. (Pour des informations sur les fichiers générés par le compilateur et le lieur, voir Packages et DLL standard.) Si #pragma package(smart_init, weak) apparaît dans un fichier unité, le lieur ne place pas l'unité dans les fichiers bpl si c'est possible, et il crée une copie locale non packagée de l'unité si elle est nécessaire à une autre application ou un autre package. Une unité compilée avec cette directive est dite faiblement packagée.

Supposons, par exemple, que vous avez créé un package appelé PACK ne contenant qu'une seule unité UNIT1, et que UNIT1 n'utilise aucune autre unité mais effectue des appels à RARE.dll. Si vous placez #pragma package(smart_init, weak) dans UNIT1.cpp lorsque vous construisez votre package, UNIT1 ne sera pas incluse dans PACK.bpl ; vous n'aurez pas à distribuer de copies de RARE.dll avec PACK. Cependant, UNIT1 sera toujours incluse dans PACK.bpi. Si un autre package ou une autre application utilisant PACK fait référence à UNIT1, celle-ci sera copiée à partir de PACK.bpi et liée directement dans le projet.

Supposons maintenant que vous ajoutez à PACK une deuxième unité, UNIT2, et que UNIT2 utilise UNIT1. Cette fois, même si vous compilez PACK avec #pragma package(smart_init, weak) dans UNIT1.cpp, le lieur inclura UNIT1 dans PACK.bpl. Mais d'autres packages ou applications faisant référence à UNIT1 utiliseront la copie (non packagée) extraite de PACK.bpi.

Remarque : Les fichiers unité contenant la directive #pragma package(smart_init, weak) ne doivent pas contenir de variables globales.

#pragma package(smart_init, weak) est une caractéristique avancée prévue pour les développeurs qui distribuent leur fichiers bpl à d'autres programmeurs C++Builder. Elle vous permet d'éviter la distribution de DLL rarement utilisées et supprime les conflits entre des packages qui peuvent dépendre de la même bibliothèque externe.

Ainsi, l'unité PenWin référence PenWin.dll. La plupart des projets n'utilisent pas PenWin et la plupart des ordinateurs n'ont pas de fichier PenWin.dll installé. C'est pour cela que l'unité PenWin est faiblement packagée dans vcl. Lorsque vous liez un projet utilisant PenWin et le package vcl, PenWin est copiée depuis vcl60.bpi et liée directement dans votre projet ; l'exécutable résultant est statiquement lié à PenWin.dll.

Si PenWin n'avait pas été faiblement packagée, deux problèmes se seraient produits. Tout d'abord, il aurait fallu que vcl soit lié de manière statique à PenWin.dll et vous n'auriez donc pas pu le charger sur un ordinateur ne disposant pas de PenWin.dll. De plus, si vous tentez de créer un package contenant PenWin, une erreur de construction aurait lieu, puisque l'unité PenWin serait contenue dans vcl et dans votre package. Ainsi, sans "packaging faible", l'unité PenWin n'aurait pas pu être incluse dans les distributions standard de vcl.

Voir aussi