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

int factorial (int n) {   if (n <= 1)    return 1;   else    return factorial (n - 1) * n; }

Код файла main.c

#include <stdio.h> #include <unistd.h> int factorial (int n); int main (int argc, char **argv) {   int n;   if (argc < 2)   {     printf ("Usage: %s n\n", argv [0]);     return -1;   }   else   {    n = atoi (argv[1]);    printf ("Factorial of %d is %d.\n", n, factorial (n));    }   return 0; }

Используйте следующую команду для компиляции и создания исполняемого файла, а затем запустите программу:

$ 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

#include <iostream> void main (void) {   cout << "Привет, мир!" << endl; }

Затем можно вызвать команду 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 Создавать все предупреждающие сообщения.