2012-05-17 39 views
0

執行時,我的計劃,我得到以下錯誤:無法加載,錯誤的符號C++名稱重整

E:無法加載libsim.so:libsim.so:未定義的符號:_ZTV15IteratorRegFile

在sim.cpp中有

有s.th.像

//IteratorRegFileIs is a wrapper that calls the constructor for IteratorRegFile 
Fwk::Ptr<IteratorRegFile> iteratorRegFile_ = IteratorRegFile::IteratorRegFileIs("RF"); 
void init(){ 
    SparseArrayInt64 *sparse_array = new SparseArrayInt64(segID); 
} 
在SparseArrayInt64.cpp

extern Fwk::Ptr<IteratorRegFile> iteratorRegFile_; 

IteratorRegFile.h:

public: 
    static IteratorRegFile::ValidPtr IteratorRegFileIs(Tac::Name _name) { 
    IteratorRegFile * m = new IteratorRegFile(_name); 
    m->referencesDec(1); 
    return m; 
    } 
protected: 
    IteratorRegFile(const IteratorRegFile&); 
    explicit IteratorRegFile(Tac::Name _name): Tac::Entity(_name), 
    index_(0) { 
    handleInit(); 
    } 

任何想法,爲什麼編譯器重整的功能,使的lib沒有找到它了嗎?

+0

Eh,一個是'Fwk :: Ptr ',另一個是'IteratorRegFile' - 爲什麼_應該定義一個滿足另一個? – ildjarn

+0

對不起剪切和粘貼錯誤 – hlitz

+0

是否一直使用「_」結尾? – stark

回答

0

如果你這樣做在Linux上用gcc:

根據C++ filt的_ZTV15IteratorRegFilevtable for IteratorRegFile。所以重名的名字是指vtvable,而不是你的功能。

我做了一些搜索,發現這個建議"You must implement virtual methods of your class because that's when the compiler actually generates the vtable for it."

您可以檢查什麼符號有一個模塊中這樣說:
nm your-module-name

我想這個鏈接可以幫助:

+0

謝謝,但我仍然無法解決問題,因爲IteratorRegFile()似乎實施。我添加了更多的代碼。 – hlitz

+0

感謝一些更多的工作,這解決了我的問題。我刪除了顯式並創建了一個單獨的構造函數的實現 – hlitz