Альтернативы для gmake? - PullRequest
       4

Альтернативы для gmake?

2 голосов
/ 07 ноября 2010

У меня есть программный файл на C ++ с двумя функциями.Если я изменю только первую функцию, почему их нужно перекомпилировать?Существует ли какая-либо система сборки, которая перекомпилирует первую и поместит ее обратно в тот же объектный файл?Это возможно?Инструкции одной функции не должны зависеть от другой, верно?Поскольку gmake перекомпилирует весь файл, это занимает много времени, разве этого не избежать?Поместить вторую функцию в отдельный файл не очень хорошая идея, так как она включает создание ненужных файлов, в которых нет необходимости.

Ответы [ 6 ]

6 голосов
/ 07 ноября 2010

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

5 голосов
/ 07 ноября 2010

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

4 голосов
/ 07 ноября 2010

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

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

1 голос
/ 07 ноября 2010

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

1 голос
/ 07 ноября 2010

Все системы сборки для C ++, которые я знаю, работают на уровне единицы перевода (файла), а не на уровне функций.Хотя теоретически это должно быть возможно, это сложно, если учесть препроцессор, например

#define ANSWER 42

void foo()
{
#undef ANSWER
#define ANSWER 41
}

int bar()
{
    return ANSWER;
}

Хотя это ужасный код, любая стандартная совместимая система компилятора / сборки должна его поддерживать.И, как вы можете видеть, изменение foo (переопределение ANSWER) может повлиять на bar.

0 голосов
/ 07 ноября 2010

Проблема не в gmake, а в компиляторе. Если вы измените одну функцию, у вас не будет другого выбора, кроме как перекомпилировать другие. Например:

  • если функция a вызывает функцию b, и вы меняете функцию b, вам необходимо убедиться, что a по-прежнему правильно вызывает b, в случае, если подпись b изменилась. *
  • если функция b находится между a и c в памяти, а теперь b увеличивается так, что больше не подходит, вам, возможно, придется переместить либо a, либо c, что также включает в себя перекомпиляцию для генерации правильных смещений.
  • Если b больше не в том же месте, вам нужно скомпилировать вызывающую его команду, a, чтобы указать на нужную функцию.

Вероятно, есть еще и лучшие случаи, когда это необходимо.

...