8
votes

Comment stocker un numéro de version dans une bibliothèque statique?

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.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.


2 commentaires

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.


5 Réponses :


10
votes

Peut-être que vous pourriez créer une chaîne avec la version comme ceci: xxx

et pour pouvoir le vérifier à partir de la coque, il suffit d'utiliser: xxx


2 commentaires

Vous feriez, bien sûr, faites ce Const Char Library_version [] = "1.3.6"; 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



10
votes

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): xxx

avis avec le mylib_check_version 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.

puis utilisez-le à partir d'une application appelante, quelque chose comme: xxx

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 ...

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: xxx

Ceci créera une structure appelée myLib_version 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.


2 commentaires

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.



3
votes

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 Strings définie par PUPPE.

Peut-être que vous pourriez simplement toucher un fichier appelé version_1.2.3 et l'ajouter à l'archive. Ensuite, vous pouvez déterminer la version en recherchant le fichier de version à l'aide de la commande AR: xxx

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.


3 commentaires

@ 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.



0
votes

plusieurs fois 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>

Vous l'utiliseriez comme ceci (cloné de la page de manuel): 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


0 commentaires

1
votes

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"


0 commentaires