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 (или суффиксы имён файлов), чтобы указать gcc, где начинать, и одну из опций -c, -S или -E, чтобы указать, где gcc должен остановиться. Обратите внимание, что некоторые комбинации (например, ‘-x cpp-output -E’) инструктируют gcc вообще ничего не делать.
-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, за исключением того, что команды не выполняются, а аргументы заключены в кавычки, если они не содержат только буквенно-цифровых символов или
./-_. Это полезно для сценариев оболочки для захвата сгенерированных драйвером командных строк. --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= можно указывать в командной строке несколько раз. Каждый последующий раз выводит запрашиваемый класс параметров, пропуская уже отображенные. Если параметр --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 в качестве дочерних модулей родительского модуля unit.
-fdump-go-spec=file-
Для входных файлов на любом языке сгенерировать соответствующие объявления Go в file. Это генерирует объявления Go для
const,type,var, иfunc, что может быть полезным способом начала написания Go интерфейса к коду, написанному на другом языке. @file
-
Считывать параметры командной строки из file. Прочитанные параметры вставляются вместо исходного параметра @file. Если file не существует или его невозможно прочитать, то параметр будет обрабатываться буквально и не удалятся.
Параметры в file разделены пробелами. Пробельный символ может быть включён в параметр, если весь параметр заключен в одинарные или двойные кавычки. Любой символ (включая обратную косую черту) может быть включён, если символ, который нужно включить, предваряется обратной косой чертой. Файл file может содержать дополнительные параметры @file; все такие параметры будут обрабатываться рекурсивно.
Далее: Вызов G++, Предыдущий: Резюме параметров, Вверх: Вызов GCC [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.5.0/gcc/Overall-Options.html