2011-01-10 5 views
7

e.exe est liée à ma bibliothèque statique personnalisée, c.lib, qui utilise l'API Win32 définie dans w.dll. w.dll se trouve dans C: \ Windows \ System32 et sa bibliothèque d'importation est w.lib, située dans le répertoire Windows SDK. Shell w.lib être répertorié comme Dépendance supplémentaire dans c.lib ou e.exe projet? (e.exe se construit avec succès dans les deux cas.) Quelle est la meilleure pratique et pourquoi? Je suppose que e.exe ne devrait pas connaître w.lib.Bibliothèque statique avec dépendances

c.lib est destiné à être partagé entre un groupe de développeurs seulement (à ne pas expédier aux clients).

ESSAI: J'utilisé VS2008 et dumpbin utilitaire pour tester les deux cas, et voici les résultats:

  • Cas 1: w.lib ajouté comme Dépendance supplémentaire dans c.lib projet.

dumpbin /archivemembers c.lib listes de sortie de deux décalages dans w.dll et fichiers OBJ de c.lib projet en tant que membres d'archives.

  • Cas n ° 2: w.lib pas ajouté comme dépendance supplémentaire dans c.lib mais e.exe projet:

Cette fois, dumpbin sortie ne contient que des fichiers OBJ de c.lib et la taille de c.lib est plus petite que dans l'affaire 1

(c.lib a été ajouté comme dépendance supplémentaire dans w.exe projet dans les deux cas)

NOTE. J'utilisé w.lib et w.dll ici que les noms fictifs, génériques pour les bibliothèques de Windows, mais ils pourraient être par exemple Userenv.lib et Userenv.dll ou Version.lib et Version.dll ...

Répondre

1

Je pense que vous ne comprenez pas ce que fait une archive et une archive d'importation.

La création d'une archive, comme vous l'avez si justement supposé dans les commentaires, crée un fichier unifié contenant des .objs compilés. Maintenant, cela peut contenir n'importe quel code que vous aimez, y compris mais non limité aux appels dynamiques aux bibliothèques. Une bibliothèque d'importation est une bibliothèque qui contient un obj qui effectue exclusivement de tels appels, l'idée étant qu'en l'important, votre exe peut trouver les symboles appropriés (ils doivent être dans l'exécutable que vous créez).

Le processus de création c.lib à partir w.lib extraits simplement des objets de w.lib et les ajoute à la collection d'objets en c.lib. En effet, c.lib devient un code bibliothèque d'importation +.

Est-ce que je pense que vous devriez faire ceci? Pas vraiment - cela pourrait conduire à la confusion quant à ce dont dépend e.exe; Je pense que vous devriez explicitement rendre cela visible plutôt que d'essayer de le cacher. Cela dit, c'est une recommandation seulement, pas une règle.

+0

Nous vous remercions de votre réponse complète. Ma présomption initiale était fausse - je pensais qu'il était souhaitable de ne pas être conscient des dépendances de lib, mais maintenant, quand je le regarde du point de vue * import library + code *, il est logique de faire savoir à l'exe quel est son code (qui inclut le code de static lib) dépend de. –

+1

Je suis confus par cette réponse. N'est-il pas courant de construire des bibliothèques sur des bibliothèques? Toute bibliothèque étendue serait considérée comme "bibliothèque d'importation + code". Je pense qu'il est préférable de cacher les détails de la bibliothèque sur laquelle on se base. – jwalk

0

Les bibliothèques ne sont pas liées, donc tout projet qui utilise un fichier .lib a également besoin de ses dépendances.

Fondamentalement, les .lib sont "copiés" à votre exe lors de la liaison.

Si vous voulez éviter que vos utilisateurs expliquent explicitement wtslib, transforme c.lib dans une DLL, les DLL sont liées et vous n'avez pas besoin de leurs dépendances pendant la compilation.

+0

Je comprends que 'link.exe' ne résout pas les références externes mais seulement zippe un ensemble de fichiers' obj' afin de créer une bibliothèque statique. Ma question portait sur les dépendances au moment de la compilation - Le cas 1 montre que 'e.exe' ne connaissait pas du tout' w.lib'. Bien sûr, 'w.dll' doit être présent à l'exécution. –

Questions connexes