Как заставить g cc хорошо обрабатывать подкаталоги во включениях? Есть ли здесь какой-нибудь флаг или какой-то вариант, который мне не хватает?
Прочитайте документацию G CC, в частности Invoking G CC глава, раздел опции препроцессора (например, -I
include-dir или -H
или -M
, et c .. .), документация препроцессора . Попробуйте также g++ --help
; флаг -I
include-directory может повторяться много раз и, вероятно, это то, что вам нужно. Конечно, порядок аргументов в программе g++
имеет большое значение. Возможно, вы захотите использовать g++
, а не gcc
при компиляции или компоновке программ на C ++.
Читайте также некоторую документацию на C ++ (возможно, даже черновик n3337" "стандарт). Помните о единицах перевода и о роли компоновщика .
На практике вы хотите запустить компиляцию G CC с использованием некоторой сборки инструмент автоматизации , такой как GNU make или ninja или многие другие.
Если вы используете GNU make
, прочтите документацию затем попробуйте make -p
, который показывает множество встроенных правил, известных этому программному обеспечению. Помните о многих функциях из make
.
Если вы используете ninja
, прочитайте документацию , вы, вероятно, захотите генерировать скрипт build.ninja
, который он использует. Вы можете сгенерировать его, используя Python скрипт или Guile один (или вашу собственную программу на C ++, et c ...).
Будьте в курсе это, конечно, g++
вызовет некоторые утилиты GNU binutils (например, ассемблер as
или компоновщик ld
).
На практике, вызывайте g++
как g++ -Wall -Wextra -g
для получения предупреждений и отладочной информации (конечно, с дополнительными -I
include-directory flags). Затем используйте отладчик gdb
. Если в вашей программе есть несколько ошибок, добавьте флаги оптимизации, такие как -O2
См. Также Clang , stati c анализатор , Frama- C и CompCert и, в конце 2020 года, Bismon .
В некоторых случаях рекомендуется создать код #include
-d C ++ ( например, с помощью SWIG или ANTLR или Qt или вашего собственного сценария) или для расширения G CC с помощью ваших плагинов .
Знайте, конечно, Джоэл Тест .