2015-12-15 2 views
8

Если я даю clang -O2 -O3 в той же командной строке, то в этом порядке -O3 будет переопределять -O2? Всегда ли переопределяет аргумент более поздней версии?
Сценарий сборки, который я не могу изменить по умолчанию, добавляет -O2, и я могу только добавлять его после него. Это приемлемая вещь?Переопределение аргументов в командной строке clang

ответ

6

Эксплуатация драйвера Clang описана на странице руководства Driver Design & Internals § Driver stages. Обратите внимание, как вы можете использовать опцию -###, чтобы заставить ее сбрасывать результат каждого этапа. Это не то, что вы можете использовать с вашей системой сборки borken, так как этот параметр должен быть указан первым. Но вы можете убедиться, что водитель делает на самом деле делать то, что вы надеетесь, что это делает:

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

Где «болтовня» является изрыгать, что я пропустил, так как там слишком много. Итак, действительно, параметр последнего-O, который вы указываете, является тем, который эффективен. Каково ожидаемое поведение для любого драйвера компилятора.

4

clang обрабатывает варианты слева направо. Таким образом, последний вариант -O «выигрывает». Это функция точно по той причине, о которой вы спрашиваете: есть возможность переопределить настройки по умолчанию, установленные кем-то другим (например, какая-то система сборки, разработчики программного обеспечения ...) Да, это абсолютно приемлемо, и у вас много хорошей компании ,

Конечная ссылка будет исходный код LLVM (опция обработки осуществляется cl::ParseCommandLineOptions() в файле lib/Support/CommandLine.cpp.)

Нестандартное мышление: даже если вы не можете изменения сборки сценария, вы можете влияние это делать то, что вы хотите. Например, параметр оптимизации может быть частью переменной, взятой из опции или из среды. Например, если сборка использует Makefile, переменная может быть названа CFLAGS или COPTS и установить с

make CFLAGS=-O3 

Если сборка использует скрипт, может быть что-то вроде

CFLAGS="-O3" ./configure 

будет работать. Там не видно, не видя сборки.

Смежные вопросы