Question

Comment puis-je stocker un numéro de version dans une bibliothèque statique (fichier.a) et vérifier plus tard sa version sous Linux?

P.S. J'ai besoin de la possibilité de vérifier la version du fichier à tout moment sans exécutable spécial en utilisant uniquement les utilitaires shell.

Était-ce utile?

La solution

Peut-être pourriez-vous créer une chaîne avec la version suivante:

char* library_version = { "Version: 1.3.6" };

et pour pouvoir le vérifier depuis le shell, utilisez simplement:

strings library.a | grep Version | cut -d " " -f 2

Autres conseils

En plus de fournir une chaîne statique comme mentionné par Puppe, il est courant de fournir une macro pour extraire le contrôle de version pour la compatibilité. Par exemple, vous pouvez avoir les macros suivantes (déclarées dans un fichier d’en-tête à utiliser avec votre bibliothèque):

#define MYLIB_MAJOR_VERSION 1
#define MYLIB_MINOR_VERSION 2
#define MYLIB_REVISION 3
#define MYLIB_VERSION "1.2.3"
#define MYLIB_VERSION_CHECK(maj, min) ((maj==MYLIB_MAJOR_VERSION) && (min<=MYLIB_MINOR_VERSION))

Avis avec la macro MYLIB_CHECK_VERSION , je suppose que vous souhaitez un rev majeur majeur et un rev mineur supérieur ou égal à la version de votre choix. Modifiez selon les besoins de votre application.

Ensuite, utilisez-le depuis une application appelante, par exemple:

if (! MYLIB_VERSION_CHECK(1, 2)) {
    fprintf(stderr, "ERROR: incompatible library version\n");
    exit(-1);
}

Cette approche fera en sorte que les informations de version proviennent du fichier d’en-tête inclus. De plus, il sera optimisé lors de la compilation pour l'application appelante. Avec un peu plus de travail, vous pouvez l'extraire de la bibliothèque elle-même. Lire la suite ...

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 ceci dans votre bibliothèque:

struct {
    const char* string;
    const unsigned major;
    const unsigned minor;
    const unsigned revision;
} mylib_version = {
    MYLIB_VERSION, MYLIB_MAJOR_VERSION, MYLIB_MINOR_VERSION, MYLIB_REVISION
};

Ceci créera une structure appelée mylib_version dans votre bibliothèque. Vous pouvez l'utiliser pour effectuer d'autres vérifications en créant des fonctions dans votre bibliothèque et en accédant à celles-ci à partir d'une application appelante, etc.

Créer une nouvelle réponse en fonction de votre modification ... Juste pour éviter toute confusion:)

Si vous cherchez un moyen de résoudre le problème sans utiliser de code, essayez-le. C'est (encore une fois) une alternative à l'approche chaînes définie par Puppe.

Peut-être pourriez-vous simplement toucher un fichier nommé 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:

ar t libmylib.a | grep 'version_' | sed -e 's/^version_//'

Je ne sais pas si cela vous donnera ce dont vous avez besoin, mais il n'existe pas de méthode standard pour incorporer de telles métadonnées dans une archive. Peut-être trouverez-vous d'autres informations que vous souhaitez stocker dans ce "métafichier". pour les archives.

Plusieurs fois man 1 ident a été mentionné, voici donc des détails sur l'utilisation de cette méthode.

ident est une commande fournie avec RCS (système de contrôle de révision), mais peut également être disponible si vous utilisez CVS (système de versions simultanées) ou Subversion.

Vous l'utiliseriez comme ceci (cloné à partir de la page de manuel):

#include <stdio.h>
static char const rcsid[] =
    "$Id: f.c,v 5.4 1993/11/09 17:40:15 eggert Exp 
ident f.c f.o
quot;; int main() { return printf("%s\n", rcsid) == EOF; }

et f.c est compilé en f.o, puis la commande

   f.c:
       $Id: f.c,v 5.4 1993/11/09 17:40:15 eggert Exp $
   f.o:
       $Id: f.c,v 5.4 1993/11/09 17:40:15 eggert Exp $

affichera

#include <stdio.h>
#define VERSION_STR "5.4"
#define CONFIG "EXP"
#define AUTHOR "eggert"
static char const sccsid[] =
    "@(#) " CONFIG " v " VERSION_STR " " __DATE__ " " __TIME__ " " AUTHOR;
int main() { return printf("%s\n", sccsid) == EOF; }

Si votre f.o était ajouté à une bibliothèque statique f.a , ident f.a devrait afficher une sortie similaire. Si vous avez plusieurs [az] .o de construction similaire dans votre az.a , vous devriez trouver toutes leurs chaînes dans le fichier az.a .

CAVEAT: Le fait qu’ils se trouvent dans le fichier .a ne signifie pas qu’ils seront inclus dans votre fichier de programme. À moins que le programme ne les référence, l'éditeur de liens ne voit pas la nécessité de les inclure. Donc, vous devez généralement avoir une méthode dans chaque module pour renvoyer la chaîne, et l'application doit appeler cette méthode. Il existe des moyens de convaincre la plupart des lieurs qu’il s’agit d’un symbole obligatoire sans le référencer, mais cela dépend de l’éditeur de liens et n’entre pas dans le cadre de cette réponse.

Si vous connaissez plutôt le SCCS (système de contrôle de code source), vous utiliserez plutôt man 1 what , et vous obtiendrez ceci (ceci est fait avec des macros pour montrer la flexibilité disponible):

what f.c f.o

et f.c est compilé en f.o, puis la commande

   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

affichera

<*>

PS: les deux ident et quels sont des commandes fournies avec des systèmes de contrôle de source centralisés spécifiques. Si vous utilisez un système de contrôle de source distribué (tel que git), le concept entier peut ne pas avoir de sens. Pour quelques idées utilisant git , consultez la discussion suivante: Moving from CVS à git: $ Id: $ équivalent? bien que le hachage ne soit pas identique à un numéro de version. :)

Si vous utilisez gcc, vous pouvez utiliser la directive #ident

#ident "Foo Version 1.2.3.4"
void foo(void){ /* foo code here */ }

Pour obtenir la version, utilisez l'un des éléments suivants:

strings -a foo.o | grep "Foo Version"
strings -a foo.a | grep "Foo Version"
strings -a foo.so | grep "Foo Version"

Cela vous permettra de compiler la version dans la bibliothèque avec la possibilité de la supprimer ultérieurement à l'aide de strip -R .comment your_file ou de l'omettre complètement en transmettant -fno-ident (Ceci omettra également les commentaires de version du compilateur des objets compilés)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top