Buildnummer für Erstellvorgang



  • Hi!
    Ich wollte in meinem C++ Projekt das __DATE__ und __TIME__ Makro für das erstellen einer Buildnummer heranziehen. Da Linker Symbole bei mir nicht gehen (Nutze VisualGDB / Cross Compiling), wollte ich einen Tipp umsetzen, dass folgendes gemacht wird:

    build.h

    #define BUILD_DATE_TIME __DATE__" "__TIME__
    

    build.cpp

    #include "build.h"
    

    In einem Pre-Build Step wird dann die build.o gelöscht.

    Leider funktioniert das nicht. Die build.o wird zwar vorher gelöscht und dann wieder nei kompiliert, aber die Zeitangabe in BUILD_DATE_TIME stimmt nicht mit dem Erstellungsdatum der build.o überein.

    Was mache ich falsch? Danke!


  • Mod

    SchlitzInDaHaus schrieb:

    Was mache ich falsch? Danke!

    Ich wette, du benutzt nirgendwo das Ergebnis deiner Aktion. define ist eine reine Textersetzung, das definiert keine Linkersymbole.

    Letzteres weist auch schon den Weg zu einer besseren Lösung (man kann aber sicherlich auch deine Lösung zum Laufen bringen): Definier doch von Hand ein Symbol zur Linkzeit! Das Linken ist auf jeden Fall der letzte (erwähnenswerte) Schritt des Buildvorgangs. Jeder gängige Linker sollte dir erlauben, über die Kommandozeile ein C-Stringliteral zu definieren. So wird die Buildnummer auf jeden Fall zur richtigen Zeit erstellt und es ist zudem nicht nötig, alle Benutzer dieser Nummer neu zu compilieren (Wie gesagt, nehme ich an, dass dies dein Fehler ist, dass du das nicht gemacht hast).



  • SeppJ schrieb:

    Ich wette, du benutzt nirgendwo das Ergebnis deiner Aktion. define ist eine reine Textersetzung, das definiert keine Linkersymbole.

    Das verstehe ich jetzt nicht. Ich wollte ja nicht beides machen, sondern nur die Lösung ab "build.h".

    Die Objektdatei die das Zeitmakro enthält wird doch bei jedem Buildvorgang gelöscht und muss deswegen neu erzeugt werden.
    Warum wird denn dann da nicht das Datum aktualisiert.

    SeppJ schrieb:

    Jeder gängige Linker sollte dir erlauben, über die Kommandozeile ein C-Stringliteral zu definieren.

    Das ist auch so. Aber ich bin noch dabei den Syntax dafür zu klären. Bei mir gestaltet sich die Situation etwas komplizierter
    als im gängigen Fall. Ich benutze das VisualGDB Framework. Dieses erlaubt, unter Visual Studio für das Intel Edison (x86)
    zu programmieren, cross zu kompilieren, und das dann auf dem Gerät zu debuggen.

    Dort wird das Makefile in einer GUI definiert, wo ich die LDFLAGS angeben kann. Ich hatte es mit

    -Wl,-gc-sections,–defsym,TIMESTAMP=$(C:\date.exe +%s)

    probiert. Aber dann kommt immer sowas wie:

    • collect2.exe: error: ld returned 1 exit status
    • i586-poky-linux-gcc.exe: error: +%s): No such file or directory

    oder so. Ich war halt grade dabei, in dem VisualGDB Forum zu klären, wie man das definiert. Aber solange wollte ich
    halt die erste Lösung probieren...


  • Mod

    SchlitzInDaHaus schrieb:

    SeppJ schrieb:

    Ich wette, du benutzt nirgendwo das Ergebnis deiner Aktion. define ist eine reine Textersetzung, das definiert keine Linkersymbole.

    Das verstehe ich jetzt nicht. Ich wollte ja nicht beides machen, sondern nur die Lösung ab "build.h".

    Die Objektdatei die das Zeitmakro enthält wird doch bei jedem Buildvorgang gelöscht und muss deswegen neu erzeugt werden.
    Warum wird denn dann da nicht das Datum aktualisiert.

    Wie ich doch gerade schon sagte: Ein Makro ist eine reine Textersetzungsregel für den Quelltext eines Programms. Das ist kein Objekt, das hinterher irgendwie Maschinencode landet. Was du brauchst, ist eine Konstante oder eine Funktion, die die Buildnummer enthält bzw. zurück gibt.


Anmelden zum Antworten