2013-04-08 20 views
7

Bu .h dosyası var tanımlanmadı: Ben clang diyor derlerkendeğişken iç bağlantı var ama

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]; 

Ne oluyor burada?

+1

Statik sınıf değişkeniniz var. Bağlantı çözümü için her yerde uygun bir şekilde tanımlanmış mı (yüklenen soru, gösterdiğiniz mesajın cevabını oldukça belirgin hale getirdiğinden). Statik sınıf üyelerinin, sınıf içinde beyan edilmeleri ve sonra sınıf dışı olarak tanımlanması gerekir. Bu üstbilginin ilişkili .cpp dosyasında bir statik DenseMap > Invariant :: Invariants; – WhozCraig

+0

Bunu yaparsam, bağlantı aşamasında görüntülenir: llvm [0]: Hata Ayıklama + Öğeleri Yüklenebilir Modül Acsl.so '/ home/giacomo/llvmtmp/llvm-csfv/Debug + Asserts/lib/Acsl. Yani ': /home/giacomo/llvmtmp/llvm-csfv/Debug+Asserts/lib/Acsl.so: tanımsız sembol: _ZN12_GLOBAL__N_19Invariant10InvaryantlarE - yükleme isteği yoksayıldı. –

+0

Bunu, başlık dosyanızdan kopyaladığınızda "statik" kelimesini tuttuğunuzu sanmıyorum, değil mi? .cpp dosyasında * statik * bildirilmemelidir. Onu eklemek benim için kötü. Bunun için üzgünüm. – WhozCraig

cevap

6

Sadece tanımlayın.

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

Bu benzersiz olan bu başlık (anonim ad alanında çünkü bu sorun değil içeren her çeviri birimi, statik üyesi oluşturur: sınıf tanımının sonra ancak anonim ad sona ermeden önce bu satırı ekleyin her çeviri birimine). Muhtemelen istediğin bu değil, ama anonim bir ad alanında Invariant tanımlamaktan kaynaklanır. Bunun yerine adlandırılmış bir ad alanı kullanırsanız, Invariants tanımını bir kaynak dosyaya koyabilirsiniz ve tüm kod tarafından yalnızca tek bir nesneye sahip olabilirsiniz.

İlgili konular