Wie speichere ich eine Versionsnummer in einer statischen Bibliothek?

8

Wie kann ich eine Versionsnummer in einer statischen Bibliothek (file.a) speichern und später unter Linux auf ihre Version prüfen?

P.S. Ich brauche die Möglichkeit, die Version der Datei jederzeit ohne spezielle ausführbare Datei zu überprüfen, die nur von Shell-Dienstprogrammen verwendet wird.

    
Pirks 28.10.2009, 15:57
quelle

5 Antworten

8

Vielleicht könnten Sie eine Zeichenfolge mit der folgenden Version erstellen:

%Vor%

und um es von der Shell aus überprüfen zu können, benutze einfach:

%Vor%     
Puppe 28.10.2009, 16:06
quelle
9

Zusätzlich zum Bereitstellen einer statischen Zeichenfolge, wie von Puppe erwähnt, ist es üblich, ein Makro bereitzustellen, um die Versionsprüfung auf Kompatibilität zu überprüfen. Beispielsweise könnten Sie die folgenden Makros haben (in einer Header-Datei deklariert, die mit Ihrer Bibliothek verwendet werden soll):

%Vor%

Beachten Sie, dass Sie mit dem Makro MYLIB_CHECK_VERSION eine bestimmte größere Version und eine kleinere Version wünschen, die größer oder gleich der gewünschten Version ist. Ändern Sie wie für Ihre Anwendung erforderlich.

Dann verwenden Sie es aus einer aufrufenden Anwendung, etwa wie folgt:

%Vor%

Dieser Ansatz führt dazu, dass die Versionsinformationen aus der enthaltenen Header-Datei stammen. Zusätzlich wird es zur Kompilierungszeit 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 diese Informationen auch verwenden, um eine statische Zeichenfolge zu erstellen, die in Ihrer Bibliothek gespeichert ist, wie von Puppe erwähnt. Platziere so etwas in deiner Bibliothek:

%Vor%

Dadurch wird eine Struktur namens mylib_version in Ihrer Bibliothek erstellt. Sie können dies für weitere Überprüfungen verwenden, indem Sie Funktionen in Ihrer Bibliothek erstellen und auf solche von einer aufrufenden Anwendung usw. zugreifen.

    
jheddings 28.10.2009 16:19
quelle
3

Erstellen einer neuen Antwort basierend auf Ihrer Bearbeitung ... Nur um Verwirrung zu vermeiden:)

Wenn Sie nach einer Möglichkeit suchen, das Problem nicht zu lösen, können Sie dies versuchen. Es ist (wieder) eine Alternative zu dem von Puppe definierten strings -Ansatz.

Vielleicht könnten Sie einfach eine Datei namens version_1.2.3 berühren und sie dem Archiv hinzufügen. Dann können Sie die Version ermitteln, indem Sie mit dem Befehl ar nach der Versionsdatei suchen:

%Vor%

Ich bin mir nicht sicher, ob Sie das bekommen, was Sie brauchen, aber es gibt keine Standardmethode, um solche Metadaten in ein Archiv einzubetten. Vielleicht finden Sie andere Informationen, die Sie in dieser "Metadatei" für das Archiv speichern möchten.

    
jheddings 28.10.2009 17:09
quelle
0

Mehrere Male wurde man 1 ident erwähnt, also hier sind Details zur Verwendung dieser Methode.

ident ist ein Befehl, der mit dem RCS (Revisionskontrollsystem) geliefert wird, ist aber möglicherweise auch verfügbar, wenn Sie CVS (Concurrent Versions System) oder Subversion verwenden.

Sie würden es so benutzen (geklont von der Manpage):

%Vor%

und f.c wird in f.o kompiliert, dann der Befehl

%Vor%

gibt

aus %Vor%

Wenn Ihre f.o zu einer statischen Bibliothek f.a hinzugefügt wurden, sollte ident f.a eine ähnliche Ausgabe anzeigen. Wenn Sie in Ihrem [a-z].o mehrere ähnlich aufgebaute az.a haben, sollten Sie alle ihre Strings in der az.a -Datei finden.

CAVEAT: Nur weil sie in der .a-Datei enthalten sind, heißt das nicht, dass sie in Ihrer Programmdatei enthalten sind. Wenn das Programm nicht auf sie verweist, muss der Linker sie nicht einschließen. Daher müssen Sie in der Regel eine Methode in jedem Modul haben, um die Zeichenfolge zurückzugeben, und die App muss diese Methode aufrufen. Es gibt Möglichkeiten, die meisten Linker davon zu überzeugen, dass es ein erforderliches Symbol ist, ohne es tatsächlich zu referenzieren, aber es hängt vom Linker ab und geht über den Rahmen dieser Antwort hinaus.

Wenn Sie stattdessen mit dem SCCS (Quellcode-Kontrollsystem) vertraut sind, würden Sie stattdessen man 1 what verwenden und es würde so aussehen (gemacht mit Makros, um die verfügbare Flexibilität anzuzeigen):

%Vor%

und f.c wird in f.o kompiliert, dann der Befehl

%Vor%

gibt

aus %Vor%

PS: Sowohl ident als auch what sind Befehle, die mit bestimmten zentralisierten Quellcodeverwaltungssystemen geliefert werden. Wenn Sie ein verteiltes Quellcodeverwaltungssystem (wie Git) verwenden, ist das gesamte Konzept möglicherweise nicht sinnvoll. Für einige Ideen, die git verwenden, siehe diesen Thread: Von CVS zu git: $ ID: $ Äquivalent? obwohl der Hash nicht mit einer Versionsnummer übereinstimmt. :)

    
Jesse Chisholm 02.06.2016 16:31
quelle
0

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

%Vor%

Um die Version zu erhalten, benutzen Sie einfach eine der folgenden Möglichkeiten:

%Vor%

Dies ermöglicht Ihnen, die Version in die Bibliothek zu kompilieren mit der Fähigkeit, sie später mit strip -R .comment your_file zu entfernen oder komplett wegzulassen, indem Sie -fno-ident übergeben (Dadurch werden auch die Compiler-Versionskommentare der kompilierten Objekte weggelassen)

    
technosaurus 02.06.2016 18:25
quelle

Tags und Links