Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

Большинство опций командной строки такие же, как применяемые в компиляторах С. Для некоторых опций никаких стандартов не предусмотрено. В этой главе мы охватим наиболее важные опции, которые используются в повседневном программировании.

Стремление соблюсти ISO-стандарт С весьма полезно, но в связи с тем, что С является низкоуровневым языком, встречаются ситуации, когда стандартные средства недостаточно выразительны. Существуют две области, в которых широко применяются расширения

gcc
: взаимодействие с ассемблерным кодом (эти вопросы раскрываются по адресу и сборка совместно используемых библиотек (см. главу 8). Поскольку заголовочные файлы являются частью совместно используемых библиотек, некоторые расширения проявляются также в системных заголовочных файлах.

Конечно, существует еще множество расширений, полезных в любом другом виде программирования, которые могут очень даже помочь при кодировании. Дополнительную информацию по этим расширениям можно найти в документации

gcc
в формате Texinfo.

5.1. Опции

gcc

gcc
принимает множество командных опций. К счастью, набор опций, о которых действительно нужно иметь представление, не так велик, и в этой главе мы его рассмотрим.

Большинство опций совпадают или подобны опциям других компиляторов,

gcc
включает в себя огромную документацию по своим опциям, доступную через info gcc (
man gcc
также выдает эту информацию, однако man-страницы не обновляются настолько часто, как документация в формате Texinfo).

– о имя_файла
Указывает имя выходного файла. Обычно в этом нет необходимости, если осуществляется компиляция в объектный файл, то есть по умолчанию происходит подстановка
имя_файла.с
на
имя_файла.о
. Однако если вы создаете исполняемый файл, по умолчанию (по историческим причинам) он создается под именем
а.out
. Это также полезно в случае, когда требуется поместить выходной файл в другой каталог.
– с
Компилирует без компоновки исходный файл, указанный для командной строки. В результате для каждого исходного файла создается объектный файл. При использовании
make
компилятор
gcc
обычно вызывается для каждого объектного файла; таким образом, в случае возникновения ошибки легче обнаружить, какой файл не смог скомпилироваться. Однако если вы вручную набираете команды, часто в одном вызове
gcc
указывается множество файлов. В случае, если при задании множества файлов в командной строке может возникнуть неоднозначность, лучше указать только один файл. Например, вместо
gcc -с -о а.о а.с b.с
имеет смысл применить
gcc -с -o a.o b.c
.
– Dfoo
Определяет препроцессорные макросы в командной строке. Возможно, потребуется отменить символы, трактуемые оболочкой как специальные. Например, при определении строки следует избегать употребления ограничивающих строки символов
"
. Вот два наиболее употребляемых способа:
'-Dfoo="bar"'
и
– Dfoo=\"bar\"
. Первый способ работает намного лучше, если в строке присутствуют пробелы, поскольку оболочка рассматривает пробелы особым образом.
– Iкаталог
Добавляет каталог в список каталогов, в которых производится поиск включаемых файлов.
– Lкаталог
Добавляет каталог в список каталогов, в которых производится поиск библиотек,
gcc
будет отдавать предпочтение совместно используемым библиотекам, а не статическим, если только не задано обратное.
– lfoo
Выполняет компоновку с библиотекой
libfoo
. Если не указано обратное,
gcc
отдает предпочтение компоновке с совместно используемыми библиотеками (
libfoo.so
), а не статическими (
libfoo.a
). Компоновщик производит поиск функций во всех перечисленных библиотеках в том порядке, в котором они перечислены. Поиск завершается тогда, когда будут найдены все искомые функции.
– static
Выполняет компоновку с только статическими библиотеками. См. главу 8.
– g
,
– ggdb
Включает отладочную информацию. Опция
– g
заставляет
gcc
включить стандартную отладочную информацию. Опция
– ggdb
указывает на необходимость включения огромного количества информации, которую в силах понять лишь отладчик
gdb
.
Если дисковое пространство ограничено или вы хотите пожертвовать некоторой функциональностью ради скорости компоновки, следует использовать
– g
. В этом случае, возможно, придется воспользоваться другим отладчиком, а не
gdb
. Для максимально полной отладки необходимо указывать
– ggdb
. В этом случае
gcc
подготовит максимально подробную информацию для
gdb
. Следует отметить, что в отличие от большинства компиляторов,
gcc
помещает некоторую отладочную информацию в оптимизированный код. Однако трассировка в отладчике оптимизированного кода может быть сопряжена со сложностями, так как во время выполнения могут происходить прыжки и пропуски фрагментов кода, которые, как ожидалось, должны были выполняться. Тем не менее, при этом можно получить хорошее представление о том, как оптимизирующие компиляторы изменяют способ выполнения кода.
– O
,
– On
Заставляет gcc оптимизировать код. По умолчанию,
gcc
выполняет небольшой объем оптимизации; при указании числа (
n
) осуществляется оптимизация на определенном уровне. Наиболее распространенный уровень оптимизации — 2; в настоящее время в стандартной версии gcc самым высоким уровнем оптимизации является 3. Мы рекомендуем использовать
– O2
или
– O3
;
– O3
может увеличить размер приложения, так что если это имеет значение, попробуйте оба варианта. Если для вашего приложения важна память и дисковое пространство, можно также использовать опцию
– Os
, которая делает размер кода минимальным за счет увеличения времени выполнения.
gcc
включает встроенные функции только тогда, когда применяется хотя бы минимальная оптимизация (
– O
).
– ansi
Поддержка в программах на языке С всех стандартов ANSI (X3.159-1989) или их эквивалента ISO (ISO/IEC 9899:1990) (обычное называемого С89 или реже С90). Следует отметить, что это не обеспечивает полное соответствие стандарту ANSI/ISO.
Опция
– ansi
отключает расширения
gcc
, которые обычно конфликтуют со стандартами ANSI/ISO. (Вследствие того, что эти расширения поддерживаются многими другими компиляторами С, на практике это не является проблемой.) Это также определяет макрос
__STRICT_ANSI__
(как описано далее в этой книге), который заголовочные файлы используют для поддержки среды, соответствующей ANSI/ISO.
– pedantic
Выводит все предупреждения и сообщения об ошибках, требуемые для ANSI/ISO-стандарта языка С. Это не обеспечивает полное соответствие стандарту ANSI/ISO.
– Wall
Включает генерацию всех предупреждений
gcc
, что обычно является полезным. Но таким образом не включаются опции, которые могут пригодиться в специфических случаях. Аналогичный уровень детализации будет установлен и для программы синтаксического контроля
lint
в отношении вашего исходного кода,
gcc
позволяет вручную включать и отключать каждое предупреждение компилятора. В руководстве по
gcc
подробно описаны все предупреждения.

5.2. Заголовочные файлы

Время от времени вы можете застать себя на том, что просматриваете заголовочные файлы Linux. Скорее всего, вы найдете рад конструкций, не совместимых со стандартом ANSI/ISO. Некоторые из них стоят того, чтобы в них разобраться. Все конструкции, рассматриваемые в этой книге, более подробно изложены в документации по

gcc
.

5.2.1. long long

Тип

long long
указывает на то, что блок памяти, по крайней мере, такой же большой, как
long
. На Intel i86 и других 32-разрядных платформах
long
занимает 32 бита, а
long long
— 64 бита. На 64-разрядных платформах указатели и
long long
занимают 64 бита, a
long
может занимать 32 или 64 бита в зависимости от платформы. Тип
long long
поддерживается в стандарте С99 (ISO/IEC 9899:1999) и является давним расширением С, которое обеспечивается
gcc
.

  • Читать дальше
  • 1
  • ...
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: