G как компилировать
Команда g++ предназначена для компиляции с помощью компилятора GCC кода на языке C++. Данная команда похожа на команду gcc, используемую для компиляции кода на языке C.
Базовый синтаксис команды выглядит следующим образом:
$ g++ [параметры] имена файлов
В качестве имен файлов могут использоваться как имена файлов исходного кода на языке C++ с расширениями .cpp и .cxx, так и имена файлов объектного кода с расширением .o. Компилятор поддерживает поистине огромное количество параметров, но наиболее важными из них являются такие параметры, как параметр -o, позволяющий задать имя результирующего исполняемого файла, параметр -c, позволяющий лишь скомпилировать файл без связывания (то есть, создать файл объектного кода, а не исполняемый файл), параметр -O, позволяющий задать уровень оптимизации и параметр -l, позволяющий указать библиотеку, которая должна быть связана с результирующим исполняемым файлом.
Примеры использования
Компиляция программы из одного файла исходного кода
Для компиляции простейшей программы из одного файла исходного кода достаточно передать компилятору имя файла исходного кода, а также имя результирующего исполняемого файла.
Это содержимое файла исходного кода test.cxx:
Как скомпилировать все файлы в каталоге и подкаталогах через g++?
Как скомпилировать все файлы в каталоге и во всех подкаталогах? Я знаю что можно скомпилировать все файлы в одном каталоге с помощью g++ *.cpp -o test но как рекурсивно пройтись по всем подкаталогам и скомпилировать все находящиеся в них файлы?
Отслеживать
задан 27 мая 2021 в 15:01
3 3 3 бронзовых знака
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
По хорошему, Вам нужно воспользоваться любом системой сборки (Make, ninja) или системой подготовки файла сборки (bazel, CMake).
Но если очень-очень хочется, то можно написать так
gcc **/*.cpp -o test
правда иногда это не работает и нужно отдельно включать через shopt -s globstar
если что, всегда можно проверить через ls **/*.cpp что именно будет компилироваться.
Компилятор GCC
GСС — это свободно доступный оптимизирующий компилятор для языков C, C++.
Программа gcc, запускаемая из командной строки, представяляет собой надстройку над группой компиляторов. В зависимости от расширений имен файлов, передаваемых в качестве параметров, и дополнительных опций, gcc запускает необходимые препроцессоры, компиляторы, линкеры.
Файлы с расширением .cc или .C рассматриваются, как файлы на языке C++, файлы с расширением .c как программы на языке C, а файлы c расширением .o считаются объектными.
Чтобы откомпилировать исходный код C++, находящийся в файле F.cc, и создать объектный файл F.o, необходимо выполнить команду:
gcc -c F.cc
Опция –c означает «только компиляция».
Чтобы скомпоновать один или несколько объектных файлов, полученных из исходного кода — F1.o, F2.o, . — в единый исполняемый файл F, необходимо ввести команду:
gcc -o F F1.o F2.o
Опция -o задает имя исполняемого файла.
Можно совместить два этапа обработки — компиляцию и компоновку — в один общий этап с помощью команды:
gcc -o F F1.cc . -lg++
— возможные дополнительные опции компиляции и компоновки. Опция –lg++ указывает на необходимость подключить стандартную библиотеку языка С++, — возможные дополнительные библиотеки.
После компоновки будет создан исполняемый файл F, который можно запустить с помощью команды
— список аргументов командной строки Вашей программы.
В процессе компоновки очень часто приходится использовать библиотеки. Библиотекой называют набор объектных файлов, сгруппированных в единый файл и проиндексированных. Когда команда компоновки обнаруживает некоторую библиотеку в списке объектных файлов для компоновки, она проверяет, содержат ли уже скомпонованные объектные файлы вызовы для функций, определенных в одном из файлов библиотек. Если такие функции найдены, соответствующие вызовы связываются с кодом объектного файла из библиотеки. Библиотеки могут быть подключены с помощью опции вида -lname . В этом случае в стандартных каталогах, таких как /lib , /usr/lib, /usr/local/lib будет проведен поиск библиотеки в файле с именем libname.a. Библиотеки должны быть перечислены после исходных или объектных файлов, содержащих вызовы к соответствующим функциям.
Опции компиляции
Среди множества опций компиляции и компоновки наиболее часто употребляются следующие:
| Опция | Назначение |
| -c | Эта опция означает, что необходима только компиляция. Из исходных файлов программы создаются объектные файлы в виде name.o. Компоновка не производится. |
| -Dname=value | Определить имя name в компилируемой программе, как значение value. Эффект такой же, как наличие строки #define name value в начале программы. Часть =value может быть опущена, в этом случае значение по умолчанию равно 1. |
| -o file-name | Использовать file-name в качестве имени для создаваемого файла. |
| -lname | Использовать при компоновке библиотеку libname.so |
| -Llib-path -Iinclude-path |
Добавить к стандартным каталогам поиска библиотек и заголовочных файлов пути lib-path и include-path соответственно. |
| —g | Поместить в объектный или исполняемый файл отладочную информацию для отладчика gdb. Опция должна быть указана и для компиляции, и для компоновки. В сочетании –g рекомендуется использовать опцию отключения оптимизации –O0 (см.ниже) |
| -MM | Вывести зависимости от заголовочных файлов , используемых в Си или С++ программе, в формате, подходящем для утилиты make. Объектные или исполняемые файлы не создаются. |
| -pg | Поместить в объектный или исполняемый файл инструкции профилирования для генерации информации, используемой утилитой gprof. Опция должна быть указана и для компиляции, и для компоновки. Собранная с опцией -pg программа при запуске генерирует файл статистики. Программа gprof на основе этого файла создает расшифровку, указывающую время, потраченное на выполнение каждой функции. |
| -Wall | Вывод сообщений о всех предупреждениях или ошибках, возникающих во время компиляции программы. |
| -O1 -O2 -O3 |
Различные уровни оптимизации. |
| -O0 | Не оптимизировать. Если вы используете многочисленные -O опции с номерами или без номеров уровня, действительной является последняя такая опция. |
| -I | Используется для добавления ваших собственных каталогов для поиска заголовочных файлов в процессе сборки |
| -L | Передается компоновщику. Используется для добавления ваших собственных каталогов для поиска библиотек в процессе сборки. |
| -l | Передается компоновщику. Используется для добавления ваших собственных библиотек для поиска в процессе сборки. |
Компилятор g++: запуск и использование

Компилятор g++ распространяется по лицензии GNU, Фондом свободного программного обеспечения (FSF), для nix-подобных ОС и является C++ компилятором, который управляется с помощью командной строки. g++ распространяется с nix системами, так что если вы работаете в ОС Unix или Linux, скорее всего в вашей системе уже установлен g++.
Чтобы запустить исходный код, с помощью компилятора g++, просто введите в терминале (командной строке) следующую команду:
g++ filename
После того, как исходный файл будет скомпилирован в исполняемый, на выходе мы получим файл с именем a и расширением .out — a.out .
Перед запуском g++ можно указать в командной строке имя исполняемого файла, который получим на выходе. Для этого необходимо указать параметр -o и присвоить нужное имя файла.
-o outputfile
Полностью команда будет выглядеть так:
g++ filename -o outputfile
Чтобы g++ показывал предупреждения об ошибках, а также поддерживал существующие стандарты языка C++, рекомендую использовать флаги:
Если вы хотите, чтобы компилятор рассматривал предупреждения как ошибки, — используйте флаг -Werror . И если появится хотя-бы одно предупреждение, то вы даже не получите исполняемый файл. Таким образом, вы точно будете знать, что не пропустили ни одной ошибки.
Если вы хотите, отлаживать исполняемый файл в отладчике GDB, включайте в команду флаг -g .
g++ filename -g -o outputfile
Это позволит отладчику GDB, дать вам подробную информацию о процессе отладки, в том числе дополнительный код в исполняемый файл.
Если вы используете *nix-подобные системы, вы также можете проверить другие опции компилятора g++, введя в командную строку следующую команду:
Создание разделяемых библиотек
Если вы хотите узнать, как создать общую библиотеку на Linux с gсс, прочитайте статью — как создать общую библиотеку на Linux с помощью gcc.