Frage

Wie kann ich eine Versionsnummer in einer statischen Bibliothek speichern (datei.a) und später für seine Version in Linux überprüfen?

P. S. Ich brauche Möglichkeit Version Datei ohne spezielle ausführbaren nur von Shell-Utilities mit jederzeit zu überprüfen.

War es hilfreich?

Lösung

Vielleicht könnten Sie eine Zeichenkette mit der Version wie folgt erstellen:

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

und der Lage sein, sie aus der Schale zu überprüfen, benutzen Sie einfach:

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

Andere Tipps

Neben eine statische Zeichenfolge bereitzustellen, durch Puppe erwähnt, ist es üblich, einen Makro, um die Versionsprüfung für die Kompatibilität zu erhalten. Zum Beispiel könnten Sie die folgenden Makros (in einer Header-Datei deklarierte mit Ihrer Bibliothek verwendet werden):

#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))

Hinweis mit dem MYLIB_CHECK_VERSION Makro, ich nehme an, Sie einen bestimmten großen rev und eine kleinere rev größer oder gleich auf die gewünschte Version wollen. Ändern Sie nach Bedarf für Ihre Anwendung.

dann verwenden, von einer rufenden Anwendung, so etwas wie:

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

Dieser Ansatz wird die Versionsinformationen veranlasst, von der im Lieferumfang enthaltenen Header-Datei zu kommen. Zusätzlich wird es bei der Kompilierung für die aufrufende Anwendung optimiert. Mit ein wenig mehr Arbeit, können Sie es aus der Bibliothek selbst extrahieren. Lesen Sie weiter ...

Sie können auch diese Informationen benutzen, eine statische Zeichenfolge in Ihrer Bibliothek gespeichert zu erstellen, wie erwähnt Puppe. Legen Sie so etwas wie dies in Ihrer Bibliothek:

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
};

Dies wird eine Struktur namens mylib_version in Ihrer Bibliothek erstellen. Sie können diese weiteren Überprüfungen zu tun verwenden, indem Funktionen in Ihrer Bibliothek zu schaffen und die von einer rufenden Anwendung zugreifen, etc.

eine neue Antwort Erstellen Ihrer Bearbeitung basiert ... Nur um Verwirrung zu vermeiden:)

Wenn Sie für einen nicht-Code Weg suchen, um das Problem zu lösen, könnte man dies versuchen. Es ist (noch einmal) eine Alternative zum strings Ansatz definiert durch Puppe.

Vielleicht könnten Sie nur eine Datei namens version_1.2.3 berühren und sie in das Archiv hinzufügen. Dann könnten Sie die Version ermitteln, indem Sie nach der Versionsdatei des ar Befehl:

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

Ich bin mir nicht sicher, ob das werden Sie bekommen, was Sie brauchen, aber es gibt keine Standardmethode für Metadaten wie dies in einem Archiv einzubetten. Vielleicht werden Sie andere Informationen finden Sie in diesem „Metafile“ für das Archiv gespeichert werden sollen.

Mehrere Male man 1 ident erwähnt, so sind hier Details über diese Methode verwendet wird.

ident ist ein Befehl, mit dem RCS (Revision Control System) kommt, aber auch verfügbar sein könnte, wenn Sie mit CVS (Concurrent Versions System) oder Subversion.

Sie würde es so verwenden (von der man-Seite geklont):

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

und F. C in f.o kompiliert, dann wird der Befehl

ident f.c f.o

Wille Ausgang

   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 $

Wenn Ihr f.o zu einer statischen Bibliothek f.a hinzugefügt wurde, dann sollte ident f.a eine ähnliche Ausgabe zeigen. Wenn Sie ähnlich gebaut [a-z].o in Ihrem az.a mehrere haben, sollten Sie alle Strings in der az.a Datei.

CAVEAT: Nur weil sie in der .a-Datei sind, bedeutet nicht, dass sie in Ihrer Programmdatei enthalten sein. Es sei denn, das Programm verweist sie sieht der Linker keine Notwendigkeit, sie zu schließen. So haben Sie in der Regel in jedem Modul ein Verfahren haben, die Zeichenfolge zurück, und die App muss diese Methode aufrufen. Es gibt Möglichkeiten, die meisten Linker zu überzeugen, dass es ein erforderliches Symbol ist, ohne es wirklich Referenzierung, aber es hängt von dem Linker und sprengt den Rahmen dieser Antwort.

Wenn Sie stattdessen sind vertraut mit dem SCCS (Source Code Control System), dann würden Sie man 1 what stattdessen verwenden, und es würde wie folgt aussehen (done mit Makros, die Flexibilität zu zeigen):

#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; }

und F. C in f.o kompiliert, dann wird der Befehl

what f.c f.o

Wille Ausgang

   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

PS: beide ident und what sind Befehle, die mit bestimmten zentralen Quelle Steuerungssystemen kommen. Wenn Sie eine verteilte Quellcode-Verwaltungssystem (wie git) verwendet das gesamte Konzept kann nicht sinnvoll. Für einige Ideen git finden Sie in diesem Thread mit: Umzug von CVS zu git: $ Id: $ äquivalent? obwohl die Hash ist nicht das gleiche wie eine Versionsnummer. :)

Wenn Sie gcc verwenden, können Sie die #ident Direktive verwenden

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

Um die Version zu erhalten nur eine der folgenden Optionen verwenden:

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

Auf diese Weise können Sie die Version in der Bibliothek mit der Fähigkeit, später mit strip -R .comment your_file Strippen kompilieren oder es vollständig, indem -fno-ident weglassen (Dies wird auch die Compiler-Version Kommentare aus den kompilierten Objekte weglassen)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top