2012-12-01 69 views
1

我有一些我試圖編譯到外部靜態庫的類。我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 

所有我的代碼頭去在「頭」目錄和實施雲在執行文件夾我有。這些作爲-I目錄傳遞。編制這個樣子的

我make文件命令:

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文件。我在做什麼錯?我想創建一個便攜式庫,我可以從此代碼中將其放入現有項目中。

回答

2

如果您的庫只包含模板代碼,那麼它本身不能編譯:例如,編譯器不知道在鏈接列表中將使用哪種類型作爲T

編譯linked_list.cpp時,編譯器只實現了基本的語法檢查並生成了一個空的目標文件。 ranlib然後抱怨,因爲你要求他從所有這些空的目標文件中創建一個空的庫。

解決方法很簡單:什麼都不做!您的客戶端代碼只需要源文件;它不需要鏈接任何庫。而且你總是需要發送.cpp文件,因爲沒有它們編譯器就無法執行任何操作。

+0

還應該注意的是,'linked_list.cpp'需要使用'Linked_list '來包含任何翻譯單元。 –

+0

它看起來'linked_list.cpp'已經在'linked_list.hpp'中包含了'#include'd,因此客戶端代碼只需要包含頭文件。 – Francesco

+0

哈哈 - 是的,那是真的。錯過了。 –