gcc и g++ — это компиляторы C и C++ от GNU. Когда gcc/g++ выполняет компиляцию, всего происходит 4 этапа:
- 1. Предварительная обработка, создание .i файлов [препроцессор cpp]
- 2. Преобразование предварительно обработанного файла в язык ассемблера, создание .s файлов [компилятор egcs]
- 3. Преобразование ассемблерного кода в объектный код (машинный код), создание .o файлов [ассемблер as]
- 4. Компоновка объектного кода для создания исполняемой программы [компоновщик ld]
Сведения о параметрах
-x language filename
Задаёт язык, используемый файлом, игнорируя расширение имени файла; действует для нескольких последующих файлов. То есть по соглашению расширение для языка C — .c, а для C++ — .C или .cpp. Если вы очень индивидуалистичны и решили, что расширение файла с вашим кодом на C — .pig, ха-ха, то вам нужно использовать этот параметр. Этот параметр действует на все имена файлов после него, пока не будет использован следующий параметр. Можно использовать следующие параметры: 'c', 'objective-c', 'c-header', 'c++', 'cpp-output', 'assembler' и 'assembler-with-cpp'.
Увидев английские названия, вы должны понять.
Пример использования:
gcc -x c hello.pig
-x none filename
Отключает предыдущую опцию, то есть позволяет gcc автоматически определять тип файла по расширению имени файла.
Пример использования:
gcc -x c hello.pig -x none hello2.c
-c
Активирует только препроцессинг, компиляцию и ассемблирование, то есть только превращает программу в obj-файл.
Пример использования:
gcc -c hello.c
Будет сгенерирован .o obj-файл.
-S
Активирует только препроцессинг и компиляцию, то есть компилирует файл в ассемблерный код.
Пример использования:
gcc -S hello.c
Будет сгенерирован .s ассемблерный код, который можно просмотреть в текстовом редакторе.
-E
Активирует только препроцессинг; при этом файл не создаётся. Нужно перенаправить вывод в файл.
Пример использования:
gcc -E hello.c > pianoapan.txt gcc -E hello.c | more
Посмотрите не спеша; даже hello world после препроцессинга превращается в 800 строк кода.
-o
Укажите имя целевого файла. По умолчанию файл, компилируемый gcc, — a.out, что некрасиво. Если вы чувствуете то же, что и я, измените его, ха-ха.
Пример использования:
gcc -o hello.exe hello.c (哦,windows用习惯了) gcc -o hello.asm -S hello.c
-pipe
Используйте конвейеры вместо временных файлов во время компиляции. Могут возникнуть некоторые проблемы при использовании не-GNU ассемблерных инструментов.
gcc -pipe -o hello.exe hello.c
-ansi
Отключить возможности GNU C, несовместимые с ANSI C, и включить специфические для ANSI C возможности (включая запрет некоторых ключевых слов, таких как asm, inline, typeof, а также макросов препроцессора, таких как UNIX, vax и т. д.).-fno-asm
Эта опция реализует часть функциональности опции ansi; она запрещает использовать asm, inline и typeof в качестве ключевых слов.
-fno-strict-prototype
Действует только для g++. С этой опцией g++ будет рассматривать функции без параметров как не имеющие явного объявления количества и типов параметров, а не как не имеющие параметров.
А gcc, независимо от того, используется ли этот параметр, будет рассматривать функции без параметров как не имеющие явного объявления типа.
-fthis-is-varialble
То есть для соответствия традиционному C++, позволяя использовать this как обычную переменную.
-fcond-mismatch
Разрешить несовпадение типов второго и третьего операндов условного выражения; значение выражения будет иметь тип void.
-funsigned-char 、-fno-signed-char、-fsigned-char 、-fno-unsigned-char
Эти четыре параметра предназначены для настройки типа char и определяют, следует ли задать char как unsigned char (первые два параметра) или signed char (последние два параметра).
-include file
Включить определённый код. Проще говоря, когда при компиляции определённого файла требуется другой файл, это можно использовать, чтобы задать его. Его действие эквивалентно использованию в коде:#include<filename>。
Пример использования:
gcc hello.c -include /root/pianopan.h
-imacros file
Развернуть макросы из файла во входном файле gcc/g++; сами определения макросов не появляются во входном файле.
-Dmacro
Эквивалентно следующему в языке C:#define macro
-Dmacro=defn
Эквивалентно следующему в языке C:#define macro=defn
-Umacro
Эквивалентно следующему в языке C:#undef macro
-undef
Отменяет определение любых нестандартных макросов.
-Idir
Когда вы используете #include "file"gcc/g++ сначала будет искать указанный вами заголовочный файл в текущем каталоге. Если он не найден, он возвращается к каталогу заголовочных файлов по умолчанию. Если вы используете -I для указания каталога, он сначала выполнит поиск в указанном вами каталоге, а затем — в обычном порядке.
Для #include<file> gcc/g++ будет искать в каталоге, указанном с помощью -I; если не найдено, затем будет искать в системном каталоге заголовочных файлов по умолчанию.
-I-
Отменяет действие предыдущего параметра, поэтому обычно используется после -Idir.
-idirafter dir
Если поиск в каталоге -I не дал результатов, он выполнит поиск в этом каталоге.
-iprefix prefix 、-iwithprefix dir
Обычно используются вместе; если поиск в каталоге -I не дал результатов, он будет искать в prefix+dir.
-nostdinc
Заставляет компилятор больше не искать заголовочные файлы в системном каталоге заголовочных файлов по умолчанию; обычно используется вместе с -I, чтобы явно ограничить расположение заголовочных файлов.
-nostdin C++
Указывает не выполнять поиск в стандартных путях, заданных g++, но по-прежнему искать в других путях. Эта опция используется при создании библиотеки libg++.
-C
Не удалять информацию комментариев во время предварительной обработки; обычно используется вместе с -E. Иногда это очень удобно для анализа программ.
-M
Создаёт информацию о зависимостях файлов. Она включает весь исходный код, от которого зависит целевой файл. Можно использоватьgcc -M hello.cдля проверки; это очень просто.
-MM
То же, что и выше, но будет игнорировать#include<file>отношения зависимостей, вызванные этим.
-MD
То же, что и -M, но вывод будет направлен в файл .d.
-MMD
То же, что и -MM, но вывод будет направлен в файл .d.
-Wa,option
Эта опция передаёт option ассемблеру; если в option есть запятая, она разбивает option на несколько опций, а затем передаёт их ассемблеру.
-Wl.option
Этот параметр передаёт option компоновщику; если в option есть запятая, он разбивает option на несколько опций, а затем передаёт их компоновщику.
-llibrary
Указывает библиотеку, используемую во время компиляции.
Пример использования
gcc -lcurses hello.c
Компилировать программу с использованием библиотеки ncurses.
-Ldir
Укажите путь для поиска библиотек во время компиляции. Например, для собственных библиотек вы можете использовать его, чтобы указать каталог; иначе компилятор будет искать только в стандартных каталогах библиотек. Этот dir — имя каталога.
-O0 、-O1 、-O2 、-O3
Четыре уровня параметров оптимизации компилятора: -O0 означает отсутствие оптимизации, -O1 используется по умолчанию, а -O3 — наивысший уровень оптимизации.
-g
Только для компилятора: генерировать отладочную информацию во время компиляции.
-gstabs
Этот параметр создаёт отладочную информацию в формате stabs, но не включает отладочную информацию gdb.
-gstabs+
Эта опция генерирует отладочную информацию в формате stabs и включает дополнительную отладочную информацию только для использования gdb.
-ggdb
Эта опция сгенерирует как можно больше отладочной информации, пригодной для использования gdb.
-static
Эта опция запрещает использование динамических библиотек, поэтому скомпилированный результат обычно очень большой и может работать без необходимости в каких-либо динамических библиотеках.
-share
Эта опция попытается использовать динамические библиотеки, поэтому создаваемый файл меньше, но в системе должны быть динамические библиотеки.
-traditional
Попытка заставить компилятор поддерживать особенности традиционного языка C.
GCC — это компилятор C и C++ от GNU. Фактически GCC может компилировать три языка: C, C++ и Object C (объектно-ориентированное расширение C). С помощью команды gcc можно одновременно компилировать и компоновать исходные программы на C и C++.
Если у вас есть два или несколько исходных файлов на C, вы также можете удобно использовать GCC для компиляции, компоновки и создания исполняемого файла. Например, предположим, у вас есть два исходных файла, main.c и factorial.c, и теперь вы хотите скомпилировать и создать программу, вычисляющую факториалы.
код файла factorial.c
Код файла main.c
Используйте следующую команду для компиляции и создания исполняемого файла, а затем запустите программу:
$ gcc -o factorial main.c factorial.c $ ./factorial 5 Factorial of 5 is 120.
GCC можно использовать для компиляции как программ на C, так и программ на C++. Обычно компилятор C определяет, является ли программа программой на C или программой на C++, по расширению исходного файла. В Linux расширение исходных файлов C — .c, а расширение исходных файлов C++ — .C или .cpp. Однако команда gcc может компилировать только исходные файлы C++ и не может автоматически компоновать их с библиотеками, используемыми программами C++. Поэтому для выполнения компиляции и компоновки программ C++ обычно используется команда g++; эта программа автоматически вызывает gcc для выполнения компиляции. Предположим, у нас есть следующий исходный файл C++ (hello.c):
код файла hello.c
Затем можно вызвать команду g++ следующим образом, чтобы скомпилировать, слинковать и создать исполняемый файл:
$ g++ -o hello hello.c $ ./hello Hello, world!
Общие опции команды gcc
| Опция | Объяснение |
|---|---|
| -ansi | Поддерживает только синтаксис C стандарта ANSI. Эта опция запрещает некоторые возможности GNU C, такие как ключевые слова asm или typeof. |
| -c | Только компилировать и создавать объектные файлы. |
| -DMACRO | Определить макрос MACRO строкой "1". |
| -DMACRO=DEFN | Определить макрос MACRO со строкой "DEFN". |
| -E | Запускать только препроцессор C. |
| -g | Генерировать отладочную информацию. Отладчик GNU может использовать эту информацию. |
| -IDIRECTORY | Указать дополнительный путь поиска заголовочных файлов DIRECTORY. |
| -LDIRECTORY | Указать дополнительный путь поиска библиотек DIRECTORY. |
| -lLIBRARY | Искать указанную библиотеку LIBRARY при компоновке. |
| -m486 | Оптимизировать код для 486. |
| -o FILE | Создать указанный выходной файл. Используется при создании исполняемых файлов. |
| -O0 | Не выполнять оптимизацию. |
| -O или -O1 | Оптимизировать сгенерированный код. |
| -O2 | Оптимизировать дополнительно. |
| -O3 | Оптимизировать сильнее, чем -O2, включая встраиваемые функции. |
| -shared | Генерировать разделяемые объектные файлы. Обычно используется при сборке разделяемых библиотек. |
| -static | Запретить разделяемое связывание. |
| -UMACRO | Отменить определение макроса MACRO. |
| -w | Не создавать никаких предупреждающих сообщений. |
| -Wall | Создавать все предупреждающие сообщения. |