3.2 Параметры, управляющие типом вывода ¶
Компиляция может включать до четырёх этапов: предварительную обработку, собственно компиляцию, сборку и компоновку, всегда в указанном порядке. GCC способен обрабатывать предварительную обработку и компиляцию нескольких файлов, либо в несколько файлов-входов для ассемблера, либо в один; затем каждый файл-вход для ассемблера производит файл-объект, а компоновка объединяет все файлы-объекты (как те, что были скомпилированы недавно, так и те, которые указаны как входные) в исполняемый файл.
Для любого данного входного файла, расширение имени файла определяет, какой тип компиляции выполняется:
file.c-
Исходный код C, который необходимо предварительно обработать.
file.i-
Исходный код C, который не должен предварительно обрабатываться.
file.ii-
Исходный код C++, который не должен предварительно обрабатываться.
file.m-
Исходный код Objective-C. Обратите внимание, что для работы программы Objective-C необходимо связать библиотеку libobjc.
file.mi-
Исходный код Objective-C, который не должен предварительно обрабатываться.
file.mmfile.M-
Исходный код 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.ccfile.cpfile.cxxfile.cppfile.CPPfile.c++file.C-
Исходный код C++, который должен предварительно обрабатываться. Обратите внимание, что в «.cxx» две последние буквы должны быть буквально «x». Аналогично, «.C» относится к букве «C».
file.mmfile.M-
Исходный код Objective-C++, который должен предварительно обрабатываться.
file.mii-
Исходный код Objective-C++, который не должен предварительно обрабатываться.
file.hhfile.Hfile.hpfile.hxxfile.hppfile.HPPfile.h++file.tcc-
Файл заголовков C++ для преобразования в предварительно скомпилированный заголовок или спецификацию Ada.
file.ffile.forfile.ftn-
Исходный код Fortran фиксированной формы, который не должен предварительно обрабатываться.
file.Ffile.FORfile.fppfile.FPPfile.FTN-
Исходный код Fortran фиксированной формы, который необходимо предварительно обработать (стандартным препроцессором).
file.f90file.f95file.f03file.f08-
Исходный код Fortran свободной формы, который не должен предварительно обрабатываться.
file.F90file.F95file.F03file.F08-
Исходный код Fortran свободной формы, который необходимо предварительно обработать (стандартным препроцессором).
file.go-
Исходный код Go.
file.brig-
Файлы BRIG (двоичное представление HSAIL).
file.d-
Исходный код D.
file.di-
Файл интерфейса D.
file.dd-
Документация исходного кода D (Ddoc).
file.ads-
Файл исходного кода Ada, содержащий объявление единицы библиотеки (объявление пакета, подпрограммы или обобщенного, или экземпляра обобщенного), или объявление переименования единицы библиотеки (объявление переименования пакета, обобщенного или подпрограммы). Такие файлы также называются спецификациями.
file.adb-
Файл исходного кода Ada, содержащий тело единицы библиотеки (тело подпрограммы или тела пакета). Такие файлы также называются телами.
file.s-
Код ассемблера.
file.Sfile.sx-
Код ассемблера, который должен быть предварительно обработан.
otherФайл объекта, который должен быть непосредственно обработан на этапе компоновки. Любой файл без распознанного расширения обрабатывается таким образом.
Вы можете явно указать язык с помощью параметра -x:
-x language-
Явно укажите язык для следующих входных файлов (вместо того, чтобы компилятор выбирал значение по умолчанию на основе расширения имени файла). Этот параметр применяется ко всем последующим входным файлам до следующего параметра -x. Возможные значения для языка:
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 d f77 f77-cpp-input f95 f95-cpp-input go brig
-x noneОтключить указание языка, так что последующие файлы будут обрабатываться в соответствии с их расширениями имён файлов (как если бы -x вообще не использовался).
Если вы хотите выполнить только некоторые этапы компиляции, вы можете использовать -x (или расширения имён файлов), чтобы указать, с какого этапа нужно начать, и один из параметров -c, -S или -E, чтобы указать, на каком этапе нужно остановиться. Обратите внимание, что некоторые комбинации (например, «-x cpp-output -E») ничего не делают.
-c-
Компилировать или собирать исходные файлы, но не связывать. Этап связывания просто не выполняется. Конечным результатом является объектный файл для каждого исходного файла.
По умолчанию имя объектного файла для исходного файла создается путем замены суффикса ‘.c’, ‘.i’, ‘.s’ и т. п. на ‘.o’.
Нераспознанные входные файлы, не требующие компиляции или сборки, игнорируются.
-S-
Прекратить после этапа собственно компиляции; не собирать. Выходные данные представлены в виде файла кода ассемблера для каждого входного файла, не являющегося файлом ассемблера.
По умолчанию имя файла ассемблера для исходного файла создается путем замены суффикса ‘.c’, ‘.i’ и т. п. на ‘.s’.
Входные файлы, не требующие компиляции, игнорируются.
-E-
Прекратить после этапа предварительной обработки; не запускать собственно компилятор. Выходные данные представляют собой преобразованный исходный код, который отправляется в стандартный вывод.
Входные файлы, не требующие предварительной обработки, игнорируются.
-
-o file¶ -
Расположить вывод в файле file. Это относится к любому типу вывода, будь то исполняемый файл, объектный файл, файл ассемблера или преобразованный C-код.
Если -o не указан, по умолчанию исполняемый файл размещается в a.out, объектный файл для source.suffix — в source.o, файл ассемблера — в source.s, файл предварительно скомпилированного заголовка — в source.suffix.gch, а весь преобразованный исходный C-код — в стандартный вывод.
-v-
Вывести (в стандартный поток ошибок) команды, выполняемые на этапах компиляции. Также вывести номер версии программы-драйвера компилятора, препроцессора и собственно компилятора.
-###-
Подобно -v, за исключением того, что команды не выполняются, а аргументы приводятся в кавычки, если они не содержат только буквенно-цифровых символов или
./-_. Это полезно для сценариев shell для захвата командных строк, сгенерированных драйвером. --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’.
- ‘common’
Отобразить опции, общие для всех языков.
Вот поддерживаемые квалификаторы:
- ‘undocumented’
-
Отобразить только те опции, которые не задокументированы.
- ‘joined’
-
Отобразить опции, принимающие аргумент, который следует после знака равенства в одном непрерывном тексте, например: ‘--help=target’.
- ‘separate’
Отобразить опции, принимающие аргумент, который является отдельным словом, следующим за исходной опцией, например: ‘-o output-file’.
Например, чтобы отобразить все не задокументированные опции, специфичные для целевой системы, поддерживаемые компилятором, используйте:
--help=target,undocumented
Значение квалификатора может быть инвертировано путем добавления префикса ‘^’, например, чтобы отобразить все бинарные опции предупреждений (то есть опции, которые либо включены, либо выключены, и которые не принимают аргумент) с описанием, используйте:
--help=warnings,^joined,^undocumented
Аргумент к --help= не должен состоять только из инвертированных квалификаторов.
Можно комбинировать несколько классов, хотя обычно это сильно ограничивает вывод, так что нечего отображать. Однако в одном случае это работает, когда один из классов — target. Например, чтобы отобразить все опции оптимизации, специфичные для целевой системы, используйте:
--help=target,optimizers
Опция --help= может быть указана несколько раз в командной строке. Каждый последующий вызов отображает запрашиваемый класс опций, пропуская уже отображенные. Если --help также указана где-либо в командной строке, она имеет приоритет над любой опцией --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
--version-
Отобразить номер версии и авторские права вызываемого GCC.
-pass-exit-codes-
Обычно программа
gccзавершается с кодом 1, если любая фаза компилятора возвращает код неудачи. Если вы укажете -pass-exit-codes, программаgccвместо этого возвращает числовой максимальный код ошибки, сгенерированный любой фазой, возвращающей код ошибки. Передние концы C, C++ и Fortran возвращают 4, если возникает внутренняя ошибка компилятора. -pipe-
Использовать каналы, а не временные файлы для связи между различными этапами компиляции. Это не работает на некоторых системах, где ассемблер не может читать из канала; но GNU ассемблер проблем не имеет.
-specs=file-
Обработать file после того, как компилятор прочитает стандартный файл specs, чтобы переопределить значения по умолчанию, которые использует программа-драйвер
gccпри определении опций для передачиcc1,cc1plus,as,ldи т. д. В командной строке может быть указано более одного -specs=file, и они обрабатываются в порядке слева направо. См. Указание подпроцессов и опций, передаваемых им для получения информации о формате file. -wrapper-
Вызвать все подкоманды в оболочке программы. Имя оболочки программы и её параметры передаются в виде списка, разделённого запятыми.
gcc -c t.c -wrapper gdb,--args
Это вызывает все подпрограммы
gccв оболочке ‘gdb --args’, следовательно, вызовcc1— ‘gdb --args cc1 …’. -ffile-prefix-map=old=new-
При компиляции файлов, находящихся в каталоге old, записывать все ссылки на них в результате компиляции так, как будто файлы находятся в каталоге new вместо этого. Указание этой опции эквивалентно указанию всех отдельных опций -f*-prefix-map. Это можно использовать для создания воспроизводимых сборок, которые не зависят от расположения. См. также -fmacro-prefix-map и -fdebug-prefix-map.
-fplugin=name.so-
Загрузить код плагина из файла name.so, предполагая, что это общая библиотека, которую нужно будет загрузить с помощью dlopen компилятором. Базовое имя файла общей библиотеки используется для идентификации плагина в целях анализа аргументов (см. -fplugin-arg-name-key=value ниже). Каждый плагин должен определять функции обратного вызова, указанные в API плагинов.
-fplugin-arg-name-key=value-
Определить аргумент key со значением value для плагина name.
-fdump-ada-spec[-slim]-
Для исходных и включаемых файлов C и C++, генерировать соответствующие спецификации Ada. См. Генерация связок Ada для заголовков C и C++ в Руководстве пользователя GNAT, которое содержит подробную документацию по этой функции.
-fada-spec-parent=unit
-
В сочетании с -fdump-ada-spec[-slim] выше, генерировать спецификации Ada как дочерние модули родительского модуля.
-fdump-go-spec=file-
Для входных файлов на любом языке генерировать соответствующие объявления Go в файле. Это генерирует объявления Go
const,type,var, иfunc, что может быть полезным способом начать написание интерфейса Go для кода, написанного на другом языке. @file-
Читать параметры командной строки из файла. Прочитанные параметры вставляются вместо исходного параметра @файл. Если файл не существует или не может быть прочитан, то параметр будет обрабатываться буквально и не будет удален.
Параметры в файле разделены пробелами. Пробельный символ может быть включён в параметр, если весь параметр заключён в одинарные или двойные кавычки. Любой символ (включая обратную косую черту) может быть включён, если символу, который нужно включить, предшествует обратная косая черта. Файл может содержать дополнительные параметры @файл; все такие параметры будут обработаны рекурсивно.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.5.0/gcc/Overall-Options.html