2013-04-08 37 views
7

我有這個.h文件中:變量有內在聯繫,但沒有定義

namespace{ 

class Invariant{ 
public: 
    Invariant(z3::expr e,Instruction *i):Expr(e),I(i){ 
    DenseMap<Instruction*,Invariant*> FunMap = Invariants[F]; 
    } 

private: 
    //static map 
    static DenseMap<Function*, DenseMap<Instruction*,Invariant*> >Invariants; 

}; 
}//end of anonymous namespace 

當我編譯鐺說:

Invariant.h:46:65: warning: variable '<anonymous namespace>::Invariant::Invariants' has internal linkage but is not defined 
    static DenseMap<Function*, DenseMap<Instruction*,Invariant*> >Invariants; 
                   ^
Invariant.h:26:48: note: used here 
    DenseMap<Instruction*,Invariant*> FunMap = Invariants[F]; 

這裏有什麼問題嗎?

+1

你有一個靜態類變量。是否可以在任何地方正確定義鏈接解析(加載的問題,因爲您顯示的信息使得答案相當明顯)。靜態類成員需要在類中聲明,然後在類外定義。在這個頭文件的關聯.cpp文件中,您需要一個靜態DenseMap > Invariant :: Invariants;'。 – WhozCraig 2013-04-08 04:42:55

+0

如果我這樣做,在鏈接階段出現: llvm [0]:鏈接調試+聲明可加載模塊Acsl.so 打開'/ home/giacomo/llvmtmp/llvm-csfv/Debug + Asserts/lib/Acsl時出錯。所以':/home/giacomo/llvmtmp/llvm-csfv/Debug+Asserts/lib/Acsl.so:undefined symbol:_ZN12_GLOBAL__N_19Invariant10InvariantsE -load request ignored ignored。 – 2013-04-08 04:46:52

+0

當你從頭文件中複製出來時,我不認爲你保留了「靜態」一詞,是嗎?它不應該在.cpp文件中聲明爲'static'。包括它在內我不好。對於那個很抱歉。 – WhozCraig 2013-04-08 04:49:24

回答

6

只需定義它。類定義之後,但匿名命名空間在年底前加入這一行:

DenseMap<Function*, DenseMap<Instruction*,Invariant*> > Invariant::Invariants; 

這將創建在每一個翻譯單元,包括這個頭(這沒關係,因爲它是在匿名的命名空間,這是獨一無二的靜態成員到每個翻譯單元)。這可能不是你想要的,但是從在匿名命名空間中定義Invariant開始。如果您使用命名空間來代替,則可以將Invariants的定義放入源文件中,並且只有一個對象由所有代碼共享。