Зависимости исходного кода - PullRequest
       33

Зависимости исходного кода

2 голосов
/ 21 сентября 2010

Предположим, у меня есть несколько файлов C ++: A.cc, B.cc, C.cc и связанные с ними заголовочные файлы. A.cc использует классы в B.cc и так далее.

Теперь скажите, что я хочу собрать исходные файлы. Могу ли я теоретически скомпилировать (а не связать) все файлы после фазы предварительной обработки одновременно? (A.cc -> A.obj, ...)

Мне просто интересно, будет ли когда-нибудь время, когда мне придется ждать, пока я закончу компиляцию A.cc, прежде чем компилировать B.cc.

Ответы [ 4 ]

8 голосов
/ 21 сентября 2010

Нет, если вы действительно не делаете что-то странное, компиляция B.cc будет не зависеть от результата компиляции A.cc (и наоборот). Вот почему make -j (параллельное выполнение нескольких «заданий», то есть процессов, каждый из которых одновременно компилирует файл ) - это популярное применение, особенно, конечно, на многоядерных машинах (но не только потому, что даже без нескольких ядер небольшое количество одновременных заданий может в конце закончить быстрее, чем тот же набор заданий, произвольно сериализованный - одно может быть заблокировано в ожидании дискового ввода-вывода, в то время как другое изменение части компиляции, интенсивно использующей процессор ...) ... если у вас достаточно физической памяти, то есть; -).

0 голосов
/ 21 сентября 2010

Существует только один случай, когда вам действительно нужна такая зависимость: когда один файл генерирует код C ++, который компилируется позже. Make достаточно гибок, чтобы поддерживать это. Но когда вы думаете о своих обычных проектах, нет, вы не хотите и не должны иметь таких зависимостей.

0 голосов
/ 21 сентября 2010

Расширения в конце файлов более или менее бессмысленны.Важно то, что у вас есть полное определение для всех классов, которые вы пытаетесь скомпилировать, даже если они еще не реализованы.Поскольку расширения .h и .cc или .cpp являются произвольными, самое важное значение имеет содержимое файлов.

Вообще говоря, если вы в состоянии полностью описать объект класса, то вы выиграли 'не сталкиваться с проблемами.Если определение класса еще не существует в цепочке, которую вы настроили (что может случиться с циклически зависимыми заголовками), тогда вы должны сделать немного магии.

Дело в том,если вы столкнетесь с этой проблемой, вам, как дизайнеру / разработчику, решать только вам

0 голосов
/ 21 сентября 2010

Вот для чего нужны заголовки, верно? make -j N сделает это за вас, хотя делает это на основе ошибочных сгенерированных пользователем Makefiles.

...