Какова правильная процедура компиляции шаблонов и / или компиляции с шаблонами? - PullRequest
0 голосов
/ 03 июля 2010

У меня есть несколько написанных шаблонных классов, которые являются зависимостями для нескольких других классов, которые мне нужно скомпилировать.У меня есть несколько вариантов того, как я могу сделать это в моем Makefile:

  1. Каждый класс, которому требуется шаблон, перечисляет свои требования к шаблону.Это имеет недостаток необходимости пересоздания дерева зависимостей каждый раз, когда я хочу добавить новый класс.

  2. Сделать шаблоны в цель как-то.Либо путем их компиляции, либо путем создания некоторого теневого дерева зависимостей, которое ничего не компилирует, а просто вызывает перекомпиляцию в случае изменения одного из шаблонов.

Любые предложения приветствуются.

Ответы [ 2 ]

1 голос
/ 03 июля 2010

Как отметил в комментарии Нил Баттерворт, заключайте сделки с файлами. Скажем, у вас есть foo.cpp и bar.h. Последний содержит ваш шаблон. И первое может сделать, например:

#include "bar.h"
class Foo : public Bar<Widget> { [...] };

Хотя ваш Foo класс наследуется и, следовательно, зависит от вашего Bar шаблонного класса, вы также уже объявляете свои файловые зависимости с помощью #include s.

Это те же зависимости файлов, которые вы указываете в вашем Makefile:

foo.o: foo.cpp bar.h
        g++ -I. -o foo.o foo.cpp

Для этого правила make ожидает, что указанные вами команды создают foo.o на основе файлов foo.cpp и bar.h. Если вы уже собрали foo.o один раз, и эти зависимости не изменились, make знает, что он может вообще пропустить правило.

Может показаться утомительным указывать файловые зависимости дважды, но, к счастью, зависимости в вашем Makefile могут автоматически генерироваться из #include s в вашем исходном коде GCC с использованием параметра командной строки -M. Вы можете прочитать об этом на справочной странице gcc(1). Просто возьмите вывод GCC, сохраните его где-нибудь, обычно foo.d и include в вашем Makefile.

С помощью некоторых волшебников вы можете автоматизировать генерацию *.d файлов зависимостей в том же Makefile, который создает ваше приложение.

1 голос
/ 03 июля 2010

В варианте 2 вы можете скомпилировать создание экземпляра шаблона, используя g ++.Например, предположим, что вы имели:

// my_class.hpp
template <typename T1, class Container, typename Compare>
class my_class {
    // ...
};

и в своем коде вы использовали my_class<long, std::vector<long>, std::greater<long> >.С помощью g ++ вы можете скомпилировать создание экземпляра my_class<long, std::vector<long>, std::greater<long> > в объектный файл:

// my_class_long_long_vector_greater_instantiation.cpp
#include "my_class.hpp"

template class my_class<long, std::vector<long>, std::greater<long> >;

Затем в вашем Makefile рядом с основанием добавьте:

my_class_long_long_vector_greater_instantiation.o: my_class.hpp

Если какая-либо цельзависит от my_class_long_long_vector_greater_instantiation.o, и объявление шаблона my_class изменилось (файл my_class.hpp был изменен), тогда GNU make выполнит повторную компиляцию my_class_long_long_vector_greater_instantiation.cpp, следовательно, повторно создаст экземпляр my_class<long, std::vector<long>, std::greater<long> >.

Смотрите также: Где шаблон?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...