In unseren Quelldateien haben wir normalerweise einen Versions-String wie diesen:
%Vor% Wenn diese Zeichenfolge nicht optimiert ist, ist sie in bestimmten Fällen sehr nützlich, da Sie die Version jeder Quelldatei, die mit einer ausführbaren Datei verknüpft ist, ermitteln können, indem Sie einfach strings a.out | grep VERSION
aufrufen.
Leider ist durch gcc (mit '-O') wegoptimiert. Also meine Frage ist, gibt es einen einfachen Weg (ein Compiler-Schalter wäre großartig), um gcc diese Variable zu behalten (der Name ist immer der gleiche), ohne andere Optimierungen auszuschalten.
Bearbeiten
Sie können __attribute__((used))
gcc (funktioniert auch in clang) für die folgenden Attribute verwenden (ich sehe, dass die Frage mit gcc
markiert ist):
Dieses an eine Funktion angehängte Attribut bedeutet, dass Code für die Funktion ausgegeben werden muss, auch wenn die Funktion nicht referenziert wird. Dies ist beispielsweise nützlich, wenn auf die Funktion nur in Inline-Assembly verwiesen wird.
Von Ссылка
Demo:
%Vor% Sie können einige #if
s und #define
s verwenden, um diesen Terser zu erstellen und auch Compiler zu kompilieren, die diese Erweiterung nicht unterstützen.
Wie ich Ihre Frage verstehe, müssen Sie jeder Objektdatei eine Versionszeichenfolge hinzufügen, ohne Quellen zu berühren. Es kann mit dem nächsten Weg gemacht werden.
Erstellen Sie eine Header-Datei, zum Beispiel include/version.h
:
Dann fügen Sie in Ihrem Makefile
(oder was auch immer Ihr Build-System ist) das nächste gcc
flag hinzu:
Natürlich sollte es an gcc
übergeben werden, z.B. so:
Jetzt können Sie beobachten, dass Ihre _ver
-Zeichenfolge für jede Objektdatei kompiliert wurde:
Was dir so etwas zeigen wird:
%Vor% Die Angabe der Variablen als volatile
kann ebenfalls hilfreich sein. Deshalb wird es an erster Stelle verwendet, um Optimierungen durch den Compiler in Bezug auf diese Variable zu verhindern.
Da es scheint, dass alle Lösungen eine Art Dekoration der Versionszeichenfolge in der Quelle erfordern, kann es hilfreich sein, ein Makro zu definieren, das die notwendige Syntax enthält, und dieses Makro dann in den Quell- oder Headerdateien zu verwenden, wann immer dies nötig ist:
%Vor%Dann in Ihrer Quelle einfach
%Vor%Das Makro kann sich in einer zentralen Projektheaderdatei oder in der Befehlszeile des Compilers befinden.
Auf diese Weise müssen Sie nicht alle Quelldateien erneut anfassen, wenn Sie etwas an der Definition ändern wollen.
Beachten Sie, wie die Makrodefinition String-Verkettung verwendet, um die endgültige Versionsstring zu erstellen. Außerdem enthält es das abschließende Semikolon, sodass Sie alles entfernen können, indem Sie bei Bedarf ein leeres Makro definieren.
Sie haben Bedenken, dass gcc
eine nicht verwendete static char[]
Variable entfernt. AFAIK, der Compiler ist richtig, dies zu tun.
Andere Antworten gaben einen Vorschlag, um das zu verbessern. Aber Sie möchten nicht den Quellcode Tausender Dateien ändern.
Dann könnten Sie vielleicht Ihren Build ändern (z. B. einige Makefile
), so dass jede solche Quelldatei, die Ihren Trick verwendet (was etwas falsch ist, wie hier besprochen ...), nicht geändert werden muss. Sie könnten also GCC gezielt aufrufen . Du willst
(dies ist eine Deklaration, keine Definition), die vor allem anderen kompiliert werden soll. Setzen Sie die Zeile oben in eine _declare_ver.h
-Datei und kompilieren Sie mit gcc -include _declare_ver.h
(stattdessen) von gcc
). Bei Verwendung von make
addiere
in Ihrem Makefile
.
Übrigens, das ist ein schmutziger Trick. Sie sollten überlegen, etwas besser zu machen (anderen Antworten folgen).