6 Stimmen

G++: Gibt es eine Möglichkeit, auf Kompilierungsflags im Code zuzugreifen, der kompiliert wird?

Gibt es einen Weg (z. B. definierte Konstanten), um auf die Kompilierungsflags zuzugreifen, mit denen der Compiler im Code ausgeführt wurde, der kompiliert wird.

Zum Beispiel möchte ich ein Programm haben, das die Flags ausgibt, mit denen es kompiliert wurde.

int main(){
    std::cout << COMPILE_FLAGS << std::endl;
}

Gibt es solche Konstanten für gcc/g++? Oder noch besser: Gibt es Konstanten, die sowohl in gcc als auch in clang definiert sind?

Ich bin insbesondere daran interessiert, das Optimierungsniveau und den Wert des -march Flags zu untersuchen. Also, wenn es keine Konstanten gibt, die alle Flags anzeigen, gibt es zumindest welche, die diese Werte anzeigen?

1voto

Kai Petzke Punkte 1419

Der folgende Befehl gibt alle vordefinierten Makros aus:

g++ -dM -E - < /dev/null

Dies funktioniert sowohl mit gcc als auch mit g++. Sie können selbst überprüfen - leider gibt es kein Makro, das einen einfachen Zugriff auf die vollständige gcc/g++-Befehlszeile ermöglicht.

Zum Glück führen die meisten -m... Flags dazu, dass angemessene Vorprozessor-Makros definiert werden. Zum Beispiel definiert -m64 __x86_64 und -m32 definiert __code_model_32__. Oder für -march: -march=core-avx2 führt zu #define __core_avx2__ 1.

Fügen Sie einfach die Option hinzu, die Sie überprüfen möchten, in den obigen Befehl und überprüfen Sie das Ergebnis für neue Makrodefinitionen.

0voto

timato Punkte 184

Wenn Sie in der Lage sind, die Kompilierungsflags oder das Skript, das den Kompilierungsbefehl generiert, zu ändern, könnten Sie ein -DCOMPILE_FLAGS\=<die gewünschten Flags> zu Ihrem Build hinzufügen, um diese Konstante tatsächlich zu erstellen.

Aus dem GCC-Handbuch:

-D name=definition Der Inhalt von definition wird tokenisiert und verarbeitet, als ob er während der Übersetzungsphase drei in einer ‘#define’-Direktive erscheinen würde. Insbesondere wird die Definition durch eingebettete Zeilenumbrüche abgeschnitten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X