Comment puis-je stocker un numéro de version dans une bibliothèque statique (fichier.a) et vérifier ultérieurement de sa version de Linux? P>
P.s. J'ai besoin de possibilité de vérifier la version du fichier à tout moment sans exécutable spécial en utilisant uniquement par Shell Utilities. p>
5 Réponses :
Peut-être que vous pourriez créer une chaîne avec la version comme ceci: et pour pouvoir le vérifier à partir de la coque, il suffit d'utiliser: p>
Vous feriez, bien sûr, faites ce Const Char Library_version [] = "1.3.6"; code> pour enregistrer l'espace du pointeur. Et vous déclarez la variable dans l'en-tête de la bibliothèque (ou dans un en-tête distribué avec la bibliothèque).
Informations ajoutées pour vérifier la version à partir d'une coquille
En plus de fournir une chaîne statique mentionnée par PUPPE, il est courant de fournir une macro pour récupérer la vérification de la version de la compatibilité. Par exemple, vous pouvez avoir les macros suivantes (déclarés dans un fichier d'en-tête à utiliser avec votre bibliothèque): avis avec le puis utilisez-le à partir d'une application appelante, quelque chose comme: p> Cette approche entraînera la provenance des informations de la version Le fichier d'en-tête fourni. De plus, il sera optimisé lors de la compilation de l'application d'appel. Avec un peu plus de travail, vous pouvez l'extraire de la bibliothèque elle-même. Lire sur ... p> Vous pouvez également utiliser ces informations pour créer une chaîne statique stockée dans votre bibliothèque, comme mentionné par PUPPE. Placez quelque chose comme ça à l'intérieur de votre bibliothèque: p> Ceci créera une structure appelée mylib_check_version code> macro, je suis En supposant que vous souhaitiez une grande révérence majeure et une révérence mineure supérieure ou égale à votre version souhaitée. Changer au besoin pour votre application. P>
myLib_version code> dans votre bibliothèque. Vous pouvez utiliser cela pour effectuer d'autres vérifications en créant des fonctions dans votre bibliothèque et en accédant à ceux d'une application appelante, etc. p> p>
Le seul problème avec le mylib_version_check que je vois est qu'il est évalué à la compilée, et un bon optimiseur supprimera le chèque si tout va bien et appelle inconditionnellement Imprimerf () - Vous voulez dire fprintf (stardr, ...) , n'est-ce pas toi? - et sortie (). Je pense qu'il serait préférable d'appeler une fonction qui a incorporé la logique plutôt que d'utiliser une expression constante.
Ouais, bons points ici ... J'ai ensuite édité mon message pour inclure l'intégration des informations dans la bibliothèque pour cette raison. Merci pour la clarification.
Création d'une nouvelle réponse basée sur votre édition ... Juste pour éviter toute confusion :)
Si vous recherchez un moyen de non-code pour résoudre le problème, vous pouvez essayer cela. C'est (encore une fois) une alternative à l'approche CODE> Strings CODE> définie par PUPPE. P>
Peut-être que vous pourriez simplement toucher un fichier appelé Je ne sais pas si cela vous obtiendra ce dont vous avez besoin, mais il y a Aucune méthode standard pour incorporer des métadonnées comme celle-ci dans une archive. Peut-être que vous trouverez d'autres informations que vous souhaitez stocker dans ce "métafile" pour l'archive. P> p> version_1.2.3 code> et l'ajouter à l'archive. Ensuite, vous pouvez déterminer la version en recherchant le fichier de version à l'aide de la commande AR: p>
@ vitaly.v.ch non disponible sur quoi que ce soit, mais Linux.
@Marcusj Il est trivial de raccourcir l'identité pour tout
Ne cendra pas. Vous avez simplement déplacé la complexité de nos mains à un tiers et ajouté une dépendance dans le processus. Je suis content que cela fonctionne pour vous, mais vous êtes ignorant si vous pensez que la solution est applicable à tout le monde.
plusieurs fois Vous l'utiliseriez comme ceci (cloné de la page de manuel): P> man 1 IDEN code> a été mentionné, voici des détails sur l'utilisation de cette méthode.
Ident code> est une commande fournie avec le contrôle de la RCS (contrôle de révision Système), mais peut également être disponible si vous utilisez des CVS (système de versions simultanées) ou Subversion. P>
f.c:
@(#) EXP v 5.4 1993/11/09 17:40:15 eggert
f.o:
@(#) EXP v 5.4 1993/11/09 17:40:15 eggert
Si vous utilisez GCC, vous pouvez utiliser la directive # -Iouse
strings -a foo.o | grep "Foo Version" strings -a foo.a | grep "Foo Version" strings -a foo.so | grep "Foo Version"
Les solutions ci-dessous (deux que j'écris) sont également disponibles pour les bibliothèques partagées, bien sûr.
Il suffit d'ajouter une autre réponse basée sur votre édition ... J'espère que cela aide.