Gcc - это свободно доступный оптимизирующий компилятор для языков C, C++, Ada 95, а также Objective C. Его версии существуют для различных реализаций Unix (а также VMS, OS/2 и других систем PC), и позволяют генерировать код для множества процессоров.
Вы можете использовать gcc для компиляции программ в объектные модули и для компоновки полученных модулей в единую исполняемую программу. Компилятор способен анализировать имена файлов, передаваемые ему в качестве аргументов, и определять, какие действия необходимо выполнить. Файлы с именами типа name.cc (или name.C) рассматриваются, как файлы на языке C++, а файлы вида name.o считаются объектными (т.е., внутримашинным представлением).
Чтобы откомпилировать исходный код C++, находящийся в файле F.cc, и создать объектный файл F.o, выполните команду:
gcc -c <compile-options> F .cc
Здесь строка compile-options указывает возможные дополнительные опции компиляции.
Чтобы скомпоновать один или несколько объектных файлов, полученных из исходного кода C++ - F1.o, F2.o, ... - в единый исполняемый файл F, используйте команду:
gcc -o F <link-options> F1.o F2.o ... -lg++ <other-libraries>
Здесь строка link-options означает возможные дополнительные опции компоновки, а строка other-libraries - подключение при компоновке дополнительных разделяемых библиотек.
Вы можете совместить два этапа обработки - компиляцию и компоновку - в один общий этап с помощью команды:
gcc -o F <compile-and-link-options> F1.cc ... -lg++ <other-libraries>
После компоновки будет создан исполняемый файл F, который можно запустить с помощью команды
./F <arguments>
,
где строка arguments определяет аргументы командной строки Вашей программы.
В процессе компоновки очень часто приходится использовать библиотеки. Библиотекой называют набор объектных файлов, сгруппированных в единый файл и проиндексированных. Когда команда компоновки обнаруживает некоторую библиотеку в списке объектных файлов для компоновки, она проверяет, содержат ли уже скомпонованные объектные файлы вызовы для функций, определенных в одном из файлов библиотек. Если такие функции найдены, соответствующие вызовы связываются с кодом объектного файла из библиотеки.
Библиотеки обычно определяются через аргументы вида -llibrary-name. В частности, -lg++ означает библиотеку стандартных функций C++, а -lm определяет библиотеку различных математических функций (sin, cos, arctan, sqrt, и т.д.). Библиотеки должны быть перечислены после исходных или объектных файлов, содержащих вызовы к соответствующим функциям.
Среди множества опций компиляции и компоновки наиболее часто употребляются следующие:
-c
Только компиляция. Из исходных файлов программы создаются объектные файлы в виде name.o. Компоновка не производится.
-Dname=value
Определить имя name в компилируемой программе, как значение value. Эффект такой
же, как наличие строки #define name value
в начале программы. Часть
`=value' может быть опущена, в этом случае значение по умолчанию равно 1.
-o file-name
Использовать file-name в качестве имени для создаваемого gcc файла (обычно это исполняемый файл).
-llibrary-name
Использовать при компоновке указанную библиотеку.
-g
Поместить в объектный или исполняемый файл отладочную информацию для отладчика gdb. Опция должна быть указана и для компиляции, и для компоновки.
-MM
Вывести заголовочные файлы (но не стандартные заголовочные файлы), используемые в каждом исходном файле, в формате, подходящем для утилиты make. Не создавать объектные или исполняемые файлы.
-pg
Поместить в объектный или исполняемый файл инструкции профилирования для
генерации информации, используемой утилитой gprof. Опция должна быть указана и
для компиляции, и для компоновки. Профилирование - это процесс
измерения продолжительности выполнения отдельных участков Вашей
программы. Когда Вы указываете -pg
, полученная исполняемая программа
при запуске генерирует файл статистики. Программа gprof на основе этого
файла создает расшифровку, указывающую время, потраченное на выполнения
каждой функции.
-Wall
Вывод сообщений о всех предупреждениях или ошибках, возникающих во время трансляции программы.
-O1
Оптимизация уровня 1. Оптимизированная трансляции требует несколько больше времени и несколько больше памяти для больших функций. Без указания опций `-O' цель компилятора состoит в том, чтобы уменьшить стоимость трансляции и выдать ожидаемые результаты при отладке. Операторы независимы: если вы останавливаете программу на контрольной точке между операторами, вы можете назначить новое значение любой переменной или поставить счетчик команд на любой другой оператор в функции и получить точно такие результаты, которые вы ожидали из исходного текста. С указанием `-O' компилятор пробует уменьшить размер кода и время исполнения.
-O2
Оптимизация уровня 2. GNU CC выполняет почти все поддерживаемые оптимизации, которые не включают уменьшение времени исполнения за счет увеличения длины кода. Компилятор не выполняет раскрутку циклов или подстановку функций, когда вы указываете `-O2'. По сравнения с `-O' эта опция увеличивает как время компиляции, так и эффективность сгенерированного кода.
-O3
Оптимизация уровня 3. `-O3' включает все оптимизации, определяемые `-O2', а также включает опцию `inline-functions'.
-O0
Не оптимизировать. Если вы используете многочисленные `-O' опции с номерами или без номеров уровня, действительной является последняя такая опция.