3.2 Параметры, управляющие видом вывода
Компиляция может включать до четырёх этапов: предварительную обработку, собственно компиляцию, сборку и компоновку, всегда в указанном порядке. GCC способен обрабатывать предварительную обработку и компиляцию нескольких файлов, либо в несколько входных файлов для ассемблера, либо в один входной файл для ассемблера; затем каждый входной файл для ассемблера производит объектный файл, а компоновка объединяет все объектные файлы (как недавно скомпилированные, так и указанные в качестве входных) в исполняемый файл.
Для каждого входного файла суффикс имени файла определяет тип выполняемой компиляции:
-
file
.c - Исходный код C, который необходимо обработать предварительно.
-
file
.i - Исходный код C, который не следует обрабатывать предварительно.
-
file
.ii - Исходный код C++, который не следует обрабатывать предварительно.
-
file
.m - Исходный код Objective-C. Обратите внимание, что для работы программы Objective-C необходимо выполнить компоновку с библиотекой
libobjc. -
file
.mi - Исходный код Objective-C, который не следует обрабатывать предварительно.
-
file
.mm- file
.M - file
- Исходный код Objective-C++, для работы программы Objective-C++ необходимо выполнить компоновку с библиотекой
libobjc. Обратите внимание, что «.M» относится к букве M в верхнем регистре. -
file
.mii - Исходный код Objective-C++, который не следует обрабатывать предварительно.
-
file
.h - Заголовочный файл C, C++, Objective-C или Objective-C++, который необходимо преобразовать в предварительно скомпилированный заголовок (по умолчанию), или заголовочный файл C или C++, который необходимо преобразовать в спецификацию Ada (через переключатель
-fdump-ada-spec). -
file
.cc- file
.cp- file
.cxx- file
.cpp- file
.CPP- file
.c++- file
.C - file
- Исходный код C++, который необходимо обработать предварительно. Обратите внимание, что в «
.cxx», последние две буквы должны быть буквально «x». Аналогично, «.C» относится к букве C в верхнем регистре. -
file
.mm- file
.M - file
- Исходный код Objective-C++, который необходимо обработать предварительно.
-
file
.mii - Исходный код Objective-C++, который не следует обрабатывать предварительно.
-
file
.hh- file
.H- file
.hp- file
.hxx- file
.hpp- file
.HPP- file
.h++- file
.tcc - file
- Заголовочный файл C++, который необходимо преобразовать в предварительно скомпилированный заголовок или спецификацию Ada.
-
file
.f- file
.for- file
.ftn - file
- Исходный код Fortran с фиксированной формой, который не следует обрабатывать предварительно.
-
file
.F- file
.FOR- file
.fpp- file
.FPP- file
.FTN - file
- Исходный код Fortran с фиксированной формой, который необходимо обработать предварительно (с традиционным препроцессором).
-
file
.f90- file
.f95- file
.f03- file
.f08 - file
- Исходный код Fortran с свободной формой, который не следует обрабатывать предварительно.
-
file
.F90- file
.F95- file
.F03- file
.F08 - file
- Исходный код Fortran со свободной формой, который необходимо обработать предварительно (с традиционным препроцессором).
-
file
.go - Исходный код Go.
-
file
.ads - Файл исходного кода Ada, содержащий объявление единицы библиотеки (объявление пакета, подпрограммы или обобщенного типа, или обобщенное создание экземпляра), или объявление переименования единицы библиотеки (объявление переименования пакета, обобщенного типа или подпрограммы). Такие файлы также называются спецификациями.
-
file
.adb - Файл исходного кода Ada, содержащий тело единицы библиотеки (тело подпрограммы или пакета). Такие файлы также называются телами.
-
file
.s - Код ассемблера.
-
file
.S- file
.sx - file
- Код ассемблера, который необходимо обработать предварительно.
- other
- Объектный файл, который должен быть непосредственно передан в компоновку. Любое имя файла без распознаваемого суффикса обрабатывается таким образом.
Вы можете явно указать язык с помощью опции -x:
-
-xlanguage - Явно укажите language для последующих входных файлов (вместо того, чтобы компилятор выбирал значение по умолчанию на основе суффикса имени файла). Эта опция применима ко всем последующим входным файлам до следующей опции
-x. Возможные значения для language следующие:c c-header cpp-output c++ c++-header c++-cpp-output objective-c objective-c-header objective-c-cpp-output objective-c++ objective-c++-header objective-c++-cpp-output assembler assembler-with-cpp ada f77 f77-cpp-input f95 f95-cpp-input go java
-x none- Отключить любое указание языка, чтобы последующие файлы обрабатывались в соответствии с их суффиксами имён файлов (так, как если бы
-xвообще не использовалась). -pass-exit-codes- В нормальном режиме программа
gccзавершается с кодом 1, если любая фаза компилятора возвращает код, отличный от успеха. Если вы укажете-pass-exit-codes, программаgccвместо этого вернёт числовое наибольшее значение ошибки, сгенерированное любой фазой, возвращающей код ошибки. Передние части C, C++ и Fortran возвращают 4, если обнаружена внутренняя ошибка компилятора.
Если вам нужны только некоторые этапы компиляции, вы можете использовать -x (или суффиксы имён файлов), чтобы указать gcc, с какой точки начать, и одну из опций -c, -S, или -E для указания, на каком этапе gcc должна остановиться. Обратите внимание, что некоторые комбинации (например, «-x cpp-output -E») инструктируют gcc ничего не делать.
-c- Компилирует или собирает исходные файлы, но не связывает их. Этап связывания просто не выполняется. Конечный результат — файл-объект для каждого исходного файла.
По умолчанию имя файла-объекта для исходного файла создаётся заменой суффикса ‘
.c’, ‘.i’, ‘.s’ и т. д. на ‘.o’.Файлы ввода, не требующие компиляции или сборки, игнорируются.
-S- Останавливается после этапа непосредственной компиляции; не выполняется сборка. Результат — файл кода ассемблера для каждого исходного файла, не являющегося файлом ассемблера.
По умолчанию имя файла ассемблера для исходного файла создаётся заменой суффикса ‘
.c’, ‘.i’ и т. д. на ‘.s’.Файлы ввода, не требующие компиляции, игнорируются.
-E- Останавливается после этапа предварительной обработки; не запускается непосредственная компиляция. Результат — код исходного файла после предварительной обработки, отправленный в стандартный вывод.
Файлы ввода, не требующие предварительной обработки, игнорируются.
-
-ofile - Выводит результат в файл file. Это относится к любому типу вывода, будь то исполняемый файл, файл-объект, файл ассемблера или преобразованный C-код.
Если
-oне указан, по умолчанию исполняемый файл помещается вa.out, файл-объект для source.suffix в source.o, файл ассемблера в source.s, файл прекомпилированного заголовка в source.suffix.gch, а весь преобразованный C-исходный код — в стандартный вывод. -v- Выводит (в стандартный поток ошибок) команды, выполненные для запуска этапов компиляции. Также выводит номер версии программы-драйвера компилятора, препроцессора и непосредственной компиляции.
-###- Подобно
-vза исключением того, что команды не выполняются, а аргументы заключены в кавычки, если они не содержат только буквенно-цифровые символы или./-_. Это полезно для скриптов оболочки, чтобы захватить сгенерированные драйвером строки команд. -pipe- Использует каналы вместо временных файлов для связи между различными этапами компиляции. На некоторых системах это не работает, если ассемблер не может читать из канала; однако GNU ассемблер проблем не имеет.
--help- Выводит (в стандартный поток вывода) описание командной строки, понятной для
gcc. Если также указан параметр-v, то--helpтакже передаётся различным процессам, вызываемымgcc, чтобы они могли отобразить принимаемые ими параметры командной строки. Если параметр-Wextraтакже указан (до параметра--help), то также отображаются параметры командной строки, для которых нет документации. --target-help- Выводит (в стандартный поток вывода) описание параметров командной строки, специфичных для каждой целевой платформы. Для некоторых целевых платформ может быть выведена дополнительная информация, специфичная для целевой платформы.
-
--help={class|[^]qualifier}[,...] - Выводит (в стандартный поток вывода) описание параметров командной строки, понятных компилятору, которые соответствуют всем указанным классам и квалификаторам. Поддерживаемые классы:
- ‘
optimizers’ - Отображает все поддерживаемые компилятором опции оптимизации.
- ‘
warnings’ - Отображает все опции, управляющие сообщениями об ошибках, генерируемыми компилятором.
- ‘
target’ - Отображает опции, специфичные для целевой платформы. В отличие от опции
--target-help, опции, специфичные для целевой платформы, для компоновщика и ассемблера, не отображаются. Это потому, что эти инструменты в настоящее время не поддерживают расширенный синтаксис--help=. - ‘
params’ - Отображает значения, распознаваемые опцией
--param. - language
- Отображает опции, поддерживаемые для language, где language — имя одного из языков, поддерживаемых в этой версии GCC.
- ‘
common’ - Отображает опции, общие для всех языков.
Поддерживаемые квалификаторы:
- ‘
undocumented’ - Отображает только те опции, которые не документированы.
- ‘
joined’ - Отображает опции, принимающие аргумент, который следует после знака равенства в одной непрерывной части текста, например: ‘
--help=target’. - ‘
separate’ - Отображает опции, принимающие аргумент, который появляется как отдельное слово после исходной опции, например: ‘
-o output-file’.
Например, чтобы отобразить все недокументированные опции, специфичные для целевой платформы, поддерживаемые компилятором, используйте:
--help=target,undocumented
Значение квалификатора можно инвертировать, добавив перед ним символ ‘
^’, например, чтобы отобразить все двоичные опции предупреждений (то есть, те, которые либо включены, либо выключены, и не принимают аргумент), имеющие описание, используйте:--help=warnings,^joined,^undocumented
Аргумент
--help=не должен состоять только из инвертированных квалификаторов.Можно объединить несколько классов, хотя это обычно сильно сужает вывод, так что отображать нечего. Однако в одном случае это работает: когда один из классов — target. Например, чтобы отобразить все опции оптимизации, специфичные для целевой платформы, используйте:
--help=target,optimizers
Опцию
--help=можно повторять в командной строке. Каждое последующее использование отображает запрашиваемый класс опций, пропуская уже отображённые.Если опция
-Qпоявляется в командной строке перед опцией--help=, то описательный текст, отображаемый--help=, изменяется. Вместо описания отображаемых опций указывается, включена ли опция, выключена или установлена в определённое значение (при условии, что компилятор знает это в тот момент, когда используется опция--help=).Вот усечённый пример из порта ARM
gcc:% gcc -Q -mabi=2 --help=target -c The following options are target specific: -mabi= 2 -mabort-on-noreturn [disabled] -mapcs [disabled]
Вывод чувствителен к влиянию предыдущих параметров командной строки, поэтому, например, чтобы узнать, какие оптимизации включены в
-O2, используйте:-Q -O2 --help=optimizers
Или, чтобы узнать, какие двоичные оптимизации включены в
-O3, используйте:gcc -c -Q -O3 --help=optimizers > /tmp/O3-opts gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts diff /tmp/O2-opts /tmp/O3-opts | grep enabled
- ‘
-no-canonical-prefixes- Не расширять символические ссылки, не разрешать ссылки на ‘
/../’ или ‘/./’, а также не делать путь абсолютным при генерации относительного префикса. --version- Отображает номер версии и авторские права вызванного GCC.
-wrapper- Вызывает все подкоманды внутри оболочки программы. Название оболочки и её параметры передаются в виде списка, разделённого запятыми.
gcc -c t.c -wrapper gdb,--args
Это вызывает все подпрограммы
gccпод ‘gdb --args’, поэтому вызовcc1— это ‘gdb --args cc1 ...’. -
-fplugin=name.so - Загружает код плагина из файла name.so, предполагая, что это общий объект, который должен быть загружен компилятором (см. -fplugin-arg-name-key=value ниже). Базовое имя файла общего объекта используется для идентификации плагина в целях анализа аргументов (см. -fplugin-arg-name-key=value ниже). Каждый плагин должен определять функции обратного вызова, указанные в API плагинов.
-
-fplugin-arg-name-key=value - Определяет аргумент key со значением value для плагина name.
-
-fdump-ada-spec[-slim] - Для исходных и включаемых файлов C и C++, генерируются соответствующие спецификации Ada. См. Генерация связывающих элементов Ada для заголовков C и C++, где приведена подробная документация по этой функции.
-
-fada-spec-parent=unit - В сочетании с
-fdump-ada-spec[-slim]выше, генерируются спецификации Ada как дочерние единицы родительской единицы unit. -
-fdump-go-spec=file - Для файлов ввода любого языка генерируются соответствующие объявления Go в file. Это генерирует объявления Go
const,type,var, иfunc, что может быть полезным способом начать создание интерфейса Go для кода, написанного на другом языке. -
@file - Считывает параметры командной строки из файла file. Прочитанные опции вставляются вместо исходной опции @file. Если файла file не существует или он не может быть прочитан, опция обрабатывается буквально и не удаляется.
Опции в file разделяются пробелами. Пробел может быть включён в опцию, если опция заключена в одинарные или двойные кавычки. Любой символ (включая обратный слэш) может быть включён, если символ, который нужно включить, предваряется обратным слэшем. Файл file может содержать дополнительные опции @file; все такие опции будут обрабатываться рекурсивно.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/Overall-Options.html