11
votes

Quelle est la convention de dénomination appropriée pour les DLL MSVC, les bibliothèques statiques et les bibliothèques d'importation

Quelle est la convention de dénomination standard ou "la plus populaire" pour les bâtiments de la bibliothèque MSVC.

Par exemple, pour la bibliothèque de plateformes suivante foo code> a ces conventions: p>

linux / GCC: P>

shared: libfoo.dll
import: libfoo.dll.a
static: libfoo.a


1 commentaires

Scons également "crée (cette) collision assez désagréable" lors de l'utilisation de env.Sharedlibrary et env.StaticLibrary avec le même nom cible.


6 Réponses :


6
votes

Comme mentionné par d'autres, il n'y a pas de normes, mais il y a des conventions populaires. Je ne suis pas sûr de juger sans ambiguïté quelle est la convention la plus populaire. En outre, la nomenclature des bibliothèques statiques par rapport aux bibliothèques d'importation, que vous avez posées sur ce sujet, il existe également une distinction analogue entre la dénomination des bibliothèques de libération par rapport aux bibliothèques de débogage, en particulier sur Windows.

Les deux cas (c'est-à-dire statique vs. Import. Le débogage vs. La libération) peut être traitée de deux manières: des noms différents ou des différents emplacements de répertoire. J'ai généralement choisi d'utiliser des noms différents, car je pense que cela minimise les chances de confondrement du type de bibliothèque ultérieurement, surtout après l'installation ou d'autres activités de déménagement de fichier. P>

I habituellement utiliser foo.dll code > et foo.lib code> pour la bibliothèque partagée sous Windows et foo_static.lib code> pour la bibliothèque statique, lorsque je souhaite avoir des versions partagées et statiques. J'ai vu d'autres personnes utilisez cette convention, ce qui pourrait donc être le "le plus populaire". P>

Donc, je recommanderais l'addition suivante à votre table: p>

Windows / MSVC: P >

add_library(FooStatic STATIC foo.cpp)
set_target_properties(FooStatic PROPERTIES OUTPUT_NAME "foo_static") 


0 commentaires

2
votes

Autant que je sache, il n'y a pas de «standard» réel, au moins aucune standard la plupart des logiciels ne se conformeraient à.

Ma convention est de nommer mon "code>" code> .lib également, mais Placez-les dans des répertoires différents si un projet arrive à prendre en charge la liaison statique et dynamique. Par exemple: xxx

La bibliothèque à lier contre dépend du choix des répertoires de la bibliothèque, il est donc presque totalement découplé du reste du processus de construction (il n'apparaîtra pas In-Source Si vous utilisez #pragma Commentaire de MSVC'S #PRAGMA (LIB, "FOO.LIB") Facility, et il n'apparaît pas dans la liste des bibliothèques d'importation pour la liaison). < P> J'ai vu cela assez à quelques reprises. De plus, je pense que les projets basés sur MSVC / Windows ont tendance à coller plus souvent avec un seul type de liaison officiel - statique, ou dynamique. Mais c'est juste mon observation personnelle.

en bref: windows / msvc xxx

Vous devez pouvoir utiliser ce motif basé sur le répertoire avec cmake (jamais utilisé). En outre, je ne pense pas que ce soit un "bogue". C'est simplement un manque de normalisation. Cmake fait (IMHO) la bonne chose pas d'établir un pseudo-standard si tout le monde l'aime différemment.


0 commentaires

2
votes

Il n'y a pas de convention de dénomination standard pour les bibliothèques. Les noms de bibliothèque traditionnelle sont préfixés avec lib . De nombreux lieurs ont des options pour préparer lib à un nom de la bibliothèque sur la ligne de commande.

Les bibliothèques statiques et dynamiques sont généralement identifiées par leur extension de fichier; Bien que cela ne soit pas requis. Donc, libmath.a serait une bibliothèque statique alors que libmath.so ou libmath.dll serait une bibliothèque dynamique.

Une convention de dénomination commune consiste à ajouter la catégorie de la bibliothèque au nom. Par exemple, une bibliothèque de mathématiques statique de débogage serait 'libmathd.a' ou sous Windows, 'lib_math_debug'. Certains magasins ajoutent également Unicode en tant qu'attribut de nom de fichier.

Si vous le souhaitez, vous pouvez ajouter _msvc au nom de la bibliothèque pour indiquer que la bibliothèque nécessite ou a été créée par MSVC (à différencier de GCC et d'autres outils). Une convention populaire lorsque vous travaillez avec plusieurs plates-formes, consiste à placer les objets et les bibliothèques dans des dossiers spécifiques à la plate-forme. Par exemple, un dossier ./ linux / contiendrait des objets et des bibliothèques pour Linux et de la même manière ./ msw / pour la plate-forme Microsoft Windows.

C'est un problème de style. Les problèmes de style sont souvent traités comme des problèmes religieux: aucun d'entre eux ne va pas, il n'y a pas de style universel, et ils sont une préférence individuelle. Quel système choisissez-vous, juste être cohérent.


0 commentaires

2
votes

Comme les autres l'ont dit, il n'y a pas de standard pour désigner des fenêtres.

Pour notre base de produits complète qui couvre 100 d'EXES, DLL et Static Libs que nous avons utilisé le Suivre avec succès depuis de nombreuses années et il a sauvé beaucoup de confusion. C'est fondamentalement un mélange de plusieurs méthodes que j'ai vues utilisées au fil des ans.

en un mot de notes Tous nos fichiers d'un préfixe et d'un suffixe (n'incluant pas l'extension elle-même). Ils commencent tous avec "OM" (basé sur notre nom de société), puis ont une combinaison de 1 ou 2 caractères qui identifie approximativement la zone de code.

Le suffixe explique quel type de fichier intégré ils sont et inclut jusqu'à trois lettres utilisées en combinaison en fonction de la construction qui inclut Unicode, statique, débogage (DLL Builds est la valeur par défaut et n'a aucun identifiant de suffixe explicite). Lorsque nous avons démarré ce système Unicode n'était pas aussi répandu et nous avons dû prendre en charge les bâtiments Unicode et non Unicode (PRE Windows 2000 OS), tout est maintenant construit de manière exclusive unicode, mais nous utilisons toujours la même nomenclature.

Donc un "ensemble" typique "de fichiers peut ressembler à xxx

Tous les fichiers sont intégrés dans un dossier couronné de bin, qui élimine beaucoup de problèmes de DLL-enfer pour Les développeurs et facilitent également les réglages de compilateur / lieur - ils indiquent tous le même emplacement à l'aide de chemins relatifs et qu'il n'y a jamais de besoin de copie manuelle (ou automatique) des bibliothèques ayant des besoins de projet. Avoir ces suffixes élimine également toute confusion sur quel type de fichier que vous pouvez avoir et vous garantit que vous ne pouvez pas avoir de scénario mixte où vous posez la DLL de débogage sur une trousse de sortie ou inversement. Tous les exès utilisent également un suffixe similaire (Unicode / Débug) et construire dans le même dossier Bin.

Il y a également un seul dossier "Inclure", chaque bibliothèque dispose d'un fichier d'en-tête dans le dossier Inclure qui correspond à la Nom de la bibliothèque / DLL (par exemple omfthread.h) qui se dépose #inclut tous les autres éléments exposés par cette bibliothèque. Cela conserve sa plus simple si vous voulez des fonctionnalités qui sont en foo.dll vous venez de simplement #include "foo.h"; Nos bibliothèques sont hautement segmentées par des zones de fonctionnalité - nous n'avons pas de DLL "Swiss-Army Count", de sorte que les bibliothèques entières fonctionnelles ont du sens. (Chacun de ces en-têtes comprend également d'autres en-têtes préalables, qu'ils soient nos bibliothèques internes ou parmi les SDK de fournisseur)

chacun de ces fichiers utilise en interne utilise des macros qui utilisent # pramga's pour ajouter le nom de la bibliothèque approprié à la ligne de liaison. Les projets individuels n'ont donc pas besoin de se préoccuper de cela. La plupart de nos bibliothèques peuvent être construites statiquement ou comme une DLL et #define om_link_static (si définie) (si définie) est utilisée pour déterminer quel projet individuel veut (nous utilisons habituellement les DLL mais dans certains cas, les bibliothèques statiques intégrées dans le fichier .exe. plus de sens pour le déploiement ou d'autres raisons) xxx

Ces macros (omlibnamnestatic & omlibname) utilisent _debug Déterminer quel type de construction est et génère le nom de la bibliothèque approprié à ajouter à la liaison Ligne.

Nous utilisons une définition courante dans les versions statiques et DLL d'une bibliothèque afin de contrôler l'exportation correcte de la classe / des fonctions dans les bâtiments DLL. Chaque classe ou fonction exportée de la bibliothèque est décorée avec cette macro (dont le nom correspond au nom de base de la bibliothèque, bien que cela soit largement sans importance) xxx

dans la DLL Version des paramètres du projet que nous définissons omfthread_declare = __ DeclSpec (Dllexport), dans la version statique de la bibliothèque de la bibliothèque que nous définissons omfthread_declare comme vide .

dans le fichier d'en-tête des bibliothèques que nous définissons Basé sur la manière dont le client tente de créer un lien avec celui-ci xxx

un projet typique qui souhaite utiliser l'une de nos bibliothèques internes, il suffirait d'ajouter les incluations appropriées à leur stdadafx.h ( En règle générale) et cela fonctionne simplement, s'ils doivent être liés à la version statique, il suffit d'ajouter om_link_static à leurs paramètres de compilateur (ou de le définir dans STDAFX.H) et il fonctionne à nouveau.


0 commentaires

6
votes

Vous faites la distinction entre une bibliothèque et une .dll par l'extension. Mais vous distinguez entre une bibliothèque d'importation et une bibliothèque statique par le nom le nom de fichier , pas l'extension.

Il n'y aura pas de cas où une bibliothèque d'importation existe pour un ensemble de code conçu pour être une bibliothèque statique, ou lorsqu'une bibliothèque statique existe pour une DLL. Ce sont deux choses différentes.

Il n'y a pas de convention de nom de fichier standard MSVC. En règle générale, un nom de bibliothèque qui se termine par "D" est souvent une version de débogage de code de bibliothèque, msvcrtd.dll vs msvcrt.dll mais autre que cela, il y a Pas de normes.


0 commentaires

1
votes

Pour autant que je sais qu'il ya toujours pas de conventions en ce qui concerne ce sujet. Voici un exemple de la façon dont je le fais:

{Projet} {} Sous-module {} Plate-forme {architecture} {CompilerRuntime} _ {} BuildType .lib / dll

Le nom complet doit être en minuscule seulement et ne doit contenir que des caractères alphanumériques avec underscores prédésignée. Le champ de sous-module, y compris son premier trait de soulignement, est facultative.

Projet: détient le nom du projet / identifiant. De préférence aussi courte que possible. à-dire "adn"

Sous-module: en option. détient le nom module. De préférence aussi courte que possible. à-dire "dna_audio"

Plate-forme: identifie la plate-forme binaire est compilé. à-dire "win32" (Windows), "WinRT", "xbox", "android".

Architecture: décrit l'architecture du binaire est compilé. à-dire "x86", "x64", "bras". Là où les noms d'architecture sont égaux pour les différents bitnesses utilisent son nom suivi du nombre de bits. c'est à dire. "Name16", "name32", "name64"

CompilerRuntime: en option. Tous les binaires contiennent un lien vers un moteur d'exécution du compilateur, mais si elles le font, il est inclus ici. à-dire "vc90" (Visual Studio 2008), "gcc". Où appartement applicable peut être inclus à savoir « vc90mt »

BuildType: en option. Cela peut contenir des lettres (dans l'ordre désiré), chacun qui racontent quelque chose sur l'accumulation de détails. d = debug (omis si release) t = statique (omis si dynamique) a = ansi (omis si unicode)

Exemples (en supposant un projet nommé « ADN »): dna_win32_x86_vc90.lib / dll dna_win32_x64_vc90_d.lib / dll dna_win32_x86_vc90_sd.lib dna_audio_win32_x64_vc90.lib / dll dna_audio_winrt_x64_vc110.lib / dll


0 commentaires