2015-12-15 22 views
8

Wenn ich -O2 -O3 in derselben Befehlszeile in dieser Reihenfolge gebe, wird die -O3 die -O2 überschreiben? Wird das spätere Argument immer überschrieben?
Ein Build-Skript, das ich nicht standardmäßig ändern kann, fügt -O2 hinzu und ich kann nur Dinge danach hinzufügen. Ist das eine akzeptable Sache?Überschreiben von Argumenten in der Befehlszeile

Antwort

6

Der Betrieb des Clang-Treibers wird in der Handbuchseite Driver Design & Internals § Driver stages beschrieben. Beachten Sie, wie Sie die Option -### verwenden können, um das Ergebnis jeder Stufe auszugeben. Dies können Sie nicht mit Ihrem Borken-Build-System trainieren, da die Option zuerst aufgeführt werden muss. Aber Sie können überprüfen, ob der Fahrer tatsächlich tut, was Sie hoffen, dass es funktioniert:

clang -### foo.cpp -O2 -O3 # dumps yayayada "-O3" yadamore 
clang -### foo.cpp -O3 -O2 # dumps yayayada "-O2" yadamore 

Wo „bla“ wird spucken, dass ich weggelassen, da es zu viel ist. In der Tat ist die letzte-O Option, die Sie angeben, diejenige, die effektiv ist. Welches ist das erwartete Verhalten für jeden Compilertreiber.

4

clang verarbeitet Optionen von links nach rechts. Somit gewinnt die letzte -O Option "gewinnt". Dies ist ein Feature genau aus dem Grund, warum Sie fragen: Es gibt also eine Möglichkeit, die von anderen gesetzten Standards zu überschreiben (zB ein Build-System, Software-Entwickler, ...) Ja, es ist absolut akzeptabel und Sie sind in guter Gesellschaft .

Die ultimative Referenz wäre die LLVM Quellcode sein (Option Handhabung wird durch cl::ParseCommandLineOptions() in Datei lib/Support/CommandLine.cpp implementiert.)

Denken außerhalb der Box: auch wenn Sie nicht Änderung das Build-Skript, können Sie Einfluss es zu tun, was Sie wollen. Zum Beispiel kann die Optimierungsoption Teil einer Variablen sein, die von einer Option oder von der Umgebung stammt. Wenn zum Beispiel der Bau eines Makefile verwendet, könnte die Variable CFLAGS oder COPTS und eingestellt werden, mit

make CFLAGS=-O3 

aufgerufen werden, wenn der Build ein Shell-Skript verwendet, vielleicht so etwas wie

CFLAGS="-O3" ./configure 

funktionieren würde. Es ist nicht zu sagen, ohne den Build zu sehen.

Verwandte Themen