Les dépendances de la bibliothèque statique imbriquée sont-elles possibles?


12

Je travaille dans QT.

  1. Une bibliothèque statique peut-elle dépendre d'une autre bibliothèque statique? (La bibliothèque statique est créée en liant une autre bibliothèque statique)
  2. Si oui, est-il possible qu'après avoir lié à lib2, la lib générée (lib1) ne contienne pas tous les codes de lib2?

Dans mon projet Qt, j'utilise une bibliothèque statique, qui dépend de plusieurs bibliothèques. J'ai dû ajouter toutes les bibliothèques (avec tous leurs en-têtes dans mon projet), bien que je n'aie besoin que d'une seule lib (et d'un .h de cette classe) dans mon code.

Veuillez expliquer le scénario.

Réponses:


6

Lorsque vous déclarez quelque chose, vous promettez simplement que lors de la liaison, il sera disponible et identifié de manière unique. Les bibliothèques statiques ne sont rien de plus que des conteneurs pour les définitions dans un format qui est en dehors de la norme. Cela a donc les implications suivantes:

1) Je ne comprends pas très bien ce que vous demandez ici, mais une bibliothèque statique peut dépendre beaucoup d'une autre bibliothèque statique. Soit vous promettez que les définitions de cette bibliothèque seront disponibles lors de la dernière étape de liaison de votre exécutable (en la fournissant comme dépendance de lien). Ou vous le "fusionnez" lors de la liaison de la bibliothèque statique.

2) La réponse à cela devient alors que la seule chose que vous devez faire est simplement de ne pas lier dans lib2 lors de la liaison de lib1.

Dans l'ensemble, la meilleure approche dans mon expérience est de fusionner uniquement les bibliothèques qui sont privées, la raison étant qu'autrement, les clients rencontreront des violations de symboles définis multipliées lorsque d'autres parties de leur projet partagent des dépendances avec vous.


Cela signifie qu'une bibliothèque statique qui dépend d'une autre bibliothèque statique, mais contient les informations de liaison de cette bibliothèque EST POSSIBLE. Cela signifie que lorsque j'ai besoin d'inclure la première bibliothèque dans mon projet, je suis obligé d'inclure la seconde également. Bcoz, la première lib ne contient pas de codes entiers de la deuxième lib.
sk patra

6

Mes deux brèves explications: 10 (désolé, terrible blague).

Pour développer légèrement, voici:

1- Une bibliothèque statique peut dépendre d'une autre bibliothèque statique, rien ou même d'une bibliothèque dynamique: dans les deux premiers cas tout le code de la nouvelle bibliothèque statique serait incorporé dans la nouvelle SLL (Static Link Library), cependant, la 3ème option , en fonction de l'environnement, le SLL pourrait avoir l'un des résultats suivants,

  • il contiendrait des versions statiques du code dont il a besoin recueillies à partir de la DLL (Dynamic Link Library)
  • ou, bien plus horriblement, vous auriez une bibliothèque statique qui, lorsqu'elle est incluse dans un projet, entraînerait l'exigence de livraison avec une DLL, rompant tout le point de la liaison statique.

Donc en bref oui, vous pouvez lier une bibliothèque statique à une bibliothèque statique

2- si lib1 et lib2 sont tous deux statiques et lib1 a été lié à lib2, alors toutes les fonctionnalités de lib2 seraient disponibles dans lib1 sans avoir besoin d'inclure lib2 car lib2 serait lié statiquement dans lib1 (pensez aux poupées russes, avec lib2 étant le plus petit).

Dans le scénario que vous décrivez, il doit y avoir une fonctionnalité discrète disponible dans chacun des fichiers que vous devez inclure, qui n'est pas liée statiquement, d'où la nécessité de plusieurs fichiers, sinon vous auriez un seul fichier à inclure et tout irait bien.

Prenez ce qui suit: Un fichier .h avec des références à 6 bibliothèques liées statiquement: vous devez inclure 7 fichiers dans votre projet pour obtenir toutes les fonctionnalités

exemple d'inclusion 1

Une SLL qui a été créée à partir dudit fichier .h ne nécessiterait que la nouvelle SLL pour être liée lors de la compilation:

exemple d'inclusion 2

J'espère que cela vous aide et que j'ai compris ce que vous demandiez.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.