Зависимости исходного кода
-
04-10-2019 - |
Вопрос
Предположим, у меня есть несколько файлов C++:A.cc, B.cc, C.cc и связанные с ними файлы заголовков.A.cc использует классы B.cc и так далее.
Теперь предположим, что я хочу собрать исходные файлы.Могу ли я теоретически скомпилировать (не связать) все файлы после этапа предварительной обработки одновременно?(A.cc -> A.obj, ...)
Мне просто интересно, будет ли когда-нибудь момент, когда мне придется ждать, пока я закончу компиляцию A.cc, прежде чем компилировать B.cc.
Решение
Нет, если вы действительно не делаете что-то странное, подборку B.cc
буду нет зависеть от результата компиляции A.cc
(наоборот). Поэтому make -j
(работает несколько «рабочих мест», т. Е. Процессы, параллельно, каждый из которых составляют файл в то же время) - это популярное использование, особенно конечно, на многоядерных машинах (но не те только, поскольку даже без нескольких ядер небольшое количество одновременных рабочих мест мая В конце концов, более быстрее, чем тот же набор рабочих мест, произвольно сериализованный - можно заблокировать ожидание диска ввода / вывода, в то время как другой отключил CPU-интенсивную часть компиляции ...) ... до тех пор, пока вы делаете Есть достаточно доступной физической памяти, то есть ;-).
Другие советы
Это то, для чего ходят заголовки, верно? Make -j n сделает это для вас, хотя оно делает его на основе падающих пользователей Makefiles.
Есть только один случай, когда вам действительно нужна такая зависимость:когда один файл генерирует код C++, который позже компилируется.Make достаточно гибок, чтобы поддерживать это.Но когда вы думаете о своих обычных проектах, нет, вы не хотите и не должны иметь таких зависимостей.
Расширения на конце файлов более или менее бессмыслены. Что важно в том, что у вас есть полное определение для всех классов, которые вы пытаетесь компилировать, даже если они еще не реализованы. Поскольку расширения .h и .cc или .CPP являются произвольными, что имеет значение больше всего, является содержание файлов.
Вообще говоря, если вы можете полностью описать объект класса, то вы не будете работать с проблемами. Если определение класса еще не существует в цепочке, которую вы настроили (что может произойти с циркулярно-зависимыми заголовками), то вы должны сделать магию.
Дело в том, что это действительно зависит от вас как дизайнер / разработчик, если вы столкнетесь с этой проблемой