Вопрос или проблема
Понимание раздела помощи C++
Я понимаю, что тот, кто написал программу, также написал раздел помощи, объясняющий, что делает каждый аргумент, который можно передать. Если я введу g++ --help
, я получу описание множества опций “в моем случае я смотрю на /usr/bin/arm-none-eabi-g++ --help
“, но они оба выглядят довольно похоже.
У меня есть вывод, сгенерированный CMake, который я пытался разобрать и понять, иногда пути указываются с помощью -I, а иногда -isystem.
/usr/bin/arm-none-eabi-g++
“-I${PICO_SDK_PATH}/src/rp2_common/pico_atomic/include”
-isystem “${PICO_SDK_PATH}/src/common/pico_stdlib_headers/include” \
Есть ли какая-то разница?
Почему я не вижу ни -I, ни -isystem, ни -D в описании –help?
В начале –help написано:
–target-help Показать специфические для цели параметры командной строки (включая параметры ассемблера и компоновщика).
–help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,…].
Я не понимаю, как открыть и просмотреть эту подсекцию помощи --help=
, чтобы увидеть, объясняется ли это в подтемах.
На самом деле я не уверен, почему текст --help
не содержит описания этих ключей. Я могу только догадываться, что они настолько стары и известны, что человек, написавший список опций для --help
, не счел нужным их включать? Можно было бы ожидать, что они будут в основных разделах --help
или --help=common
, но, увы.
Но они включены в полную документацию:
https://gcc.gnu.org/onlinedocs/
Из полного списка вы можете перейти к более специфичным, и, например, разница между -I
и -isystem
описана здесь: https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/Directory-Options.html
Ответ или решение
Вы правильно понимаете, что секция помощи (help) любой программы, в том числе компилятора g++, содержит информацию о доступных параметрах и аргументах. Когда вы вводите команду g++ --help
или arm-none-eabi-g++ --help
, вы видите список опций, которые могут быть использованы с компилятором, но, как вы заметили, не все параметры, такие как -I
, -isystem
или -D
, могут быть упомянуты в выводе.
Различия между -I
и -isystem
-I
и -isystem
используются для указания каталогов, где компилятор должен искать заголовочные файлы, но между ними есть важные различия:
-
-I
(глобальный путь): Этот параметр добавляет указанный каталог к списку мест, где компилятор будет искать заголовочные файлы. При этом порядок поиска включает как указанный каталог, так и стандартные системные каталоги, после чего система может выдать предупреждения, если в этих заголовках будут обнаружены какие-либо проблемы. -isystem
(системный путь): Этот параметр также добавляет каталог для поиска заголовков, но в этом случае каталоги, прописанные с помощью-isystem
, имеют приоритет. Более того, компилятор не будет выдавать предупреждения о проблемах в заголовках, найденных в-isystem
, что может быть полезно при работе с библиотеками, где вы не хотите, чтобы предупреждения от стандартных заголовков мешали компиляции.
Почему параметры не упоминаются в --help
Причина, по которой опции как -I
, -isystem
и -D
могут отсутствовать в выводе --help
, может быть связана с их "классическим" статусом и тем фактом, что они давно известны в среде разработчиков. Возможно, подразумевалось, что пользователи, использующие эти параметры, должны знать о них из других источников или документации.
Доступ к разделу под-справки
Вы можете получить дополнительную информацию о параметрах компилятора с помощью --help=...
. Например, вы можете попробовать следующие команды:
g++ --help=common
— чтобы получить информацию о общих параметрах.g++ --help=target
— для информации о параметрах, специфичных для целевой архитектуры.
Эти команды позволят вам увидеть более детализированные подкатегории помощи.
Можно также обратиться к полному руководству по G++. Полная документация доступна здесь, где вы можете найти все параметры и их описание.
Чтобы более детально изучить разные опции, включая различия между -I
и -isystem
, вы можете ознакомиться с данной страницей документации: Directory Options.
Надеюсь, это поможет вам лучше понять различия в параметрах и как пользоваться документацией компилятора!