代码之家  ›  专栏  ›  技术社区  ›  alexgolec

编译模板和/或使用模板编译的正确程序是什么?

  •  0
  • alexgolec  · 技术社区  · 16 年前

    我已经编写了一些模板类,它们是我需要编译的其他几个类的依赖项。关于如何在Makefile中执行此操作,我有几个选项:

    1. 以某种方式使模板成为目标。要么编译它们,要么生成一个影子依赖树,它不编译任何东西,只是在其中一个模板被修改时强制重新编译。

    欢迎提出任何建议。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Stéphan Kochen    16 年前

    正如Neil Butterworth在评论中提到的,处理文件。假设你有一个 foo.cpp bar.h

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

    Foo 类继承,因此取决于 Bar 在模板类中,您也已经用 #include

    这些文件依赖关系与您在Makefile中指定的相同:

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

    对于此规则,make要求您指定的命令创建 foo.o foo.cpp文件 和 文件夹。如果你已经建造了 foo.o.公司 一旦这些依赖项没有改变,make就知道它可以完全跳过规则。

    两次指定文件依赖项似乎很乏味,但幸运的是,Makefile中的依赖项可以从 #包括 GCC使用 -M 命令行参数。你可以在报纸上看到 gcc(1) foo.d ,和 include 在你的Makefile里。

    通过一些魔法,您可以自动生成 *.d

        2
  •  1
  •   Daniel Trebbien    16 年前

    在选项2中,可以使用g++编译模板实例化。例如,假设您有:

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

    在你的代码里 my_class<long, std::vector<long>, std::greater<long> > 我的班级<长,std::向量<长>,标准::更大<长>&燃气轮机; 到对象文件中:

    // 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 my_class_long_long_vector_greater_instantiation.cpp ,因此重新实例化 .

    另请参见: Where's the Template?