GCC команды · 4 min read · Jan 22, 2026
Необычные, но полезные параметры командной строки GCC
Инструменты программного обеспечения обычно предлагают множество функций, но, как согласится большинство из вас, не все их функции используются всеми. В общем, в этом нет ничего плохого, так как у каждого пользователя есть свои требования, и они используют инструменты только в этой сфере. Тем не менее, всегда полезно продолжать исследовать инструменты, которые вы используете, так как вы никогда не знаете, когда одна из их функций может пригодиться, сэкономив вам немного вашего драгоценного времени в процессе.
Пример: компиляторы. Хороший компилятор языка программирования всегда предлагает множество опций, но пользователи, как правило, знают и используют только ограниченный набор. В частности, если вы разработчик на языке C и используете Linux в качестве своей платформы разработки, скорее всего, вы используете компилятор gcc, который предлагает бесконечный список параметров командной строки.
Знаете ли вы, что если хотите, вы можете попросить gcc сохранить вывод на каждом этапе процесса компиляции? Знаете ли вы, что опция -Wall, которую вы используете для генерации предупреждений, не охватывает некоторые специфические предупреждения? Существует множество параметров командной строки gcc, которые не часто используются, но могут быть чрезвычайно полезны в определенных сценариях, например, при отладке кода.
Итак, в этой статье мы рассмотрим несколько таких опций, предлагая все необходимые детали и объясняя их через простые для понимания примеры, где это необходимо.
Но прежде чем мы продолжим, пожалуйста, имейте в виду, что все примеры, команды и инструкции, упомянутые в этом руководстве, были протестированы на Ubuntu 16.04 LTS, а версия gcc, которую мы использовали, - 5.4.0.
Просмотр промежуточного вывода на каждом этапе компиляции
Знаете ли вы, что в целом существует четыре этапа, через которые проходит ваш код на C, когда вы компилируете его с помощью компилятора gcc? Это предварительная обработка, компиляция, сборка и линковка. После каждого этапа gcc создает временный выходной файл, который передается на следующий этап. Теперь это все временные файлы, которые создаются, и поэтому мы не можем их увидеть - все, что мы видим, это то, что мы выдали команду компиляции, и она производит бинарный/исполняемый файл, который мы можем запустить.
Но предположим, что во время отладки есть необходимость увидеть, как код выглядел после, скажем, этапа предварительной обработки. Что бы вы сделали? Хорошая новость в том, что компилятор gcc предлагает параметр командной строки, который вы можете использовать в своей стандартной команде компиляции, и вы получите те промежуточные файлы, которые в противном случае были бы удалены компилятором. Опция, о которой мы говорим, - это -save-temps.
Вот что говорит страница man gcc об этой опции:
Хранить обычные "временные" промежуточные файлы постоянно; помещать
их в текущий каталог и называть их на основе исходного
файла. Таким образом, компиляция foo.c с -c -save-temps создает файлы
foo.i и foo.s, а также foo.o. Это создает предварительно обработанный
выходной файл foo.i, даже если компилятор теперь обычно использует
интегрированный препроцессор.
При использовании в сочетании с параметром командной строки -x,
-save-temps достаточно разумен, чтобы избежать перезаписи входного
исходного файла с тем же расширением, что и промежуточный файл.
Соответствующий промежуточный файл может быть получен путем переименования
исходного файла перед использованием -save-temps.Следующая команда даст вам представление о том, как вы можете использовать эту опцию:
gcc -Wall-save-temps** test.c -o test-exec
И вот как я проверил, что все промежуточные файлы действительно были созданы после выполнения вышеупомянутой команды:

Как вы можете видеть на скриншоте выше, файлы test.i, test.s и test.o были созданы опцией -save-temps. Эти файлы соответствуют этапам предварительной обработки, компиляции и линковки соответственно.
Подготовьте свой код к отладке и профилированию
Существуют специальные инструменты, которые позволяют вам отлаживать и профилировать ваш исходный код. Например, gdb используется для целей отладки, в то время как gprof является популярным инструментом для профилирования. Но знаете ли вы, что существуют специфические параметры командной строки, которые gcc предлагает для подготовки вашего кода к отладке и профилированию?
Начнем с отладки. Чтобы иметь возможность использовать gdb для отладки кода, вам нужно будет скомпилировать ваш код с помощью параметра командной строки -g, предоставленного компилятором gcc. Эта опция позволяет gcc создавать информацию для отладки, которая требуется gdb для успешной отладки вашей программы.
Если вы планируете использовать эту опцию, вам рекомендуется ознакомиться с деталями, которые страница man gcc предлагает по этой опции - некоторые из них могут оказаться жизненно важными в некоторых случаях. Например, вот выдержка из страницы man:
GCC позволяет вам использовать -g с -O. Упрощения, сделанные
оптимизированным кодом, могут иногда приводить к неожиданным результатам:
некоторые переменные, которые вы объявили, могут вообще не существовать;
поток управления может кратковременно перемещаться туда, где вы не
ожидали; некоторые операторы могут не выполняться, потому что они
вычисляют постоянные результаты или их значения уже известны;
некоторые операторы могут выполняться в разных местах, потому что
они были вынесены из циклов.
Тем не менее, отладка оптимизированного вывода оказывается
возможной. Это делает разумным использование оптимизатора для
программ, в которых могут быть ошибки.Не только gdb, компиляция вашего кода с использованием опции -g также открывает возможность полного использования инструмента memcheck от Valgrind. Для тех, кто не в курсе, memcheck используется программистами для проверки утечек памяти (если таковые имеются) в их коде. Вы можете узнать больше об этом инструменте здесь.
Двигаясь дальше, чтобы иметь возможность использовать gprof для профилирования кода, вам нужно будет скомпилировать ваш код с помощью параметра командной строки -pg. Это позволяет gcc генерировать дополнительный код для записи информации о профилировании, которая требуется gprof для анализа кода. “Вы должны использовать эту опцию при компиляции исходных файлов, о которых вы хотите получить данные, и вы также должны использовать ее при линковке,” - говорит страница man gcc. Чтобы узнать больше о том, как выполнять профилирование кода с помощью gprof, перейдите к этому специальному руководству на нашем сайте.
Примечание: Использование обеих опций -g и -pg аналогично тому, как использовалась опция -save-temps в предыдущем разделе.
Заключение
Если вы не являетесь профессионалом gcc, я уверен, что вы узнали что-то новое из этой статьи. Попробуйте эти опции и посмотрите, как они работают. Тем временем, ждите следующей части в этой серии руководств, где мы обсудим еще больше таких интересных и полезных параметров командной строки gcc.
Get new posts in your inbox
No spam. Unsubscribe anytime.