разделение компиляции, чтобы избежать перекомпиляции при добавлении отладки в файл .h - PullRequest
1 голос
/ 06 октября 2009

У меня есть файл .h, который используется почти во всем исходном коде (в моем случае это всего лишь один каталог с файлами .cc и .h). В основном я храню две версии файла .h: одну с некоторой информацией для отладки для анализа кода и обычную. Отладочная версия имеет только один дополнительный макрос и объявление функции extern. Я довольно регулярно переключаюсь между двумя версиями. Однако это вызывает 20-минутную перекомпиляцию.

Как бы вы порекомендовали избежать этой проблемы перекомпиляции? Возможно установить несколько флагов, создать другое дерево? Каковы общие решения и как их встраивать?

Новый файл .h содержит:

extern  void (foo)(/*some params*/);

/***extra stuff****/
#define foo(...) ( /*call_some_function*/) , foo())
/*some_functions*_for_debugging/

Как видите, за этим последует перекомпиляция. Я строю с gcc на Linux AS 3

Спасибо

Ответы [ 5 ]

3 голосов
/ 06 октября 2009

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

Я бы интенсивно использовал предварительно скомпилированные заголовки для ускорения перекомпиляции (так как этого нельзя избежать). GCC и Precompiled-Headers . Для других компиляторов используйте ваш любимый поисковик. Любой современный компилятор должен поддерживать эту функцию, для крупномасштабных проектов это неизбежно, вы должны использовать его, иначе вы будете действительно непродуктивными.

Кроме того, если у вас достаточно места на диске, я бы проверил две рабочие копии. Каждый из них составлен с разными настройками. Вам придется каждый раз фиксировать и обновлять, чтобы перенести изменения в другую рабочую копию, но это наверняка займет не более 20 минут; -)

2 голосов
/ 06 октября 2009

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

В новых.ч

extern  void (foo)(/*some params*/);

/***extra stuff****/
#define foo(...) ( /*call_some_function_dummy*/) , foo())
/*some_functions*_for_debugging/

В новом.c

call_some_function_dummy()
{

#ifdef _DEBUG

    call_some_function()

#endif

}

Теперь, если вы переключитесь в режим отладки, нужно перекомпилировать только New.c, и компиляция будет намного быстрее. Надеюсь, это поможет вам.

Решение 2:

В нов.ч

extern void (foo)(/*some params*/);

/***extra stuff****/ 
#define foo(...) ( /*call_some_function[0]*/) , foo()) 
/*some_functions*_for_debugging/

In New.c

#ifdef _DEBUG 

call_some_function[] = 
{
    call_some_function0,
    call_some_function1
};

#else 

call_some_function[]
{
    dummy_nop,
    dummy_nop
};

#endif
2 голосов
/ 06 октября 2009

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

  1. Сохраните два набора объектных файлов, один без кода отладки и один с. Используйте разные make-файлы / конфигурации сборки, чтобы их можно было хранить в разных местах.

  2. Используйте глобальную переменную в следующих строках:

В вашем общем. Ч .:

extern int debug;

В вашем debug.c:

int debug = 1;

Везде (можно использовать макрос для этого):

if (debug) {
    /*(do_debug_stuff*/
}

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

2 голосов
/ 06 октября 2009

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

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

1 голос
/ 06 октября 2009

Почему бы не переместить макрос в собственный заголовок и включать его только там, где это необходимо.

Просто еще одна мысль.

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

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

Помните, что аппаратное обеспечение дешево Программисты стоят дорого , чтобы процитировать имя пользователя.

...