使用外部实现编译模板到静态库

时间:2012-12-01 22:59:41

标签: c++ templates makefile static-libraries

我有一些我正在尝试编译到外部静态库的类。我的linked_list.hpp(我正在尝试编译的linked_list的标题)看起来像:

#include "list_base.hpp"

template <typename T>

class Linked_list : public List_base <T> {


    public://
        Linked_list();
        ~Linked_list();

    public://accessor functions
        Linked_list<T> * next();//go to the next element in the list
        Node<T> * get_current_node() const;//return the current node
        T get_current() const;//get the current data
        T get(int index) const;//this will get the specified index and will return the data it holds

    public://worker functions
        Linked_list<T> * push(T value);//push a value into the front of the list
        Linked_list<T> * pop_current();//deletes the current_node--resets the current as the next element in the list!
        Linked_list<T> * reset();//this resets the current to the front of the list
        Linked_list<T> * erase(int index);

    private://variables
        Node<T> * current;//store the current node


};

#include "linked_list.cpp"//grab the template implementation file


#endif

我的所有代码头都放在“header”目录中,实现位于我的实现文件夹中。它们作为-I目录传递。

我的用于编译的make file命令如下所示:

static: $(DEPENDENCIES)
    ar rcs liblist_templates.a node.o list_base.o linked_list.o 

并在运行时给我这个错误......

/usr/bin/ranlib: warning for library: liblist_templates.a the table of contents is empty (no object file members in the library define global symbols)

我创建了一个包含“linked_list.hpp”和库的其他几个部分的主头文件,但每当我包含它时,它似乎仍然在寻找包含的cpp文件。我做错了什么?我想创建一个可移植的库,我可以从这段代码中删除现有的项目。

1 个答案:

答案 0 :(得分:2)

如果您的库只包含模板代码,则无法自行编译:例如,编译器不知道哪个类型将在链表中用作T

编译linked_list.cpp时,编译器只实现了基本语法检查并生成了一个空目标文件。 ranlib然后抱怨,因为你要他从所有这些空目标文件中创建一个空库。

解决方案很简单:什么都不做!您的客户端代码只需要源文件;它不需要与任何库链接。而且你总是需要发送.cpp文件,因为没有它们,编译器就无法做任何事情。