ich diese .h-Datei haben:Variable interne Bindung ist aber nicht definiert
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
Wenn ich kompilieren Klirren sagt:
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];
Was ist das Problem?
Sie haben eine statische Klassenvariable. Ist es irgendwo für die Auflösung der Verbindung richtig definiert (geladene Frage, da die Nachricht, die Sie zeigen, die Antwort ziemlich offensichtlich macht). Statische Klassenmitglieder müssen in Klassen deklariert und dann außerhalb der Klasse definiert werden. Sie benötigen eine 'static DenseMap> Invariant :: Invariants;' in der zugehörigen .cpp-Datei für diesen Header. –
WhozCraig
Wenn ich das mache, erscheint in der Linking-Phase: llvm [0]: Verknüpfung Debug + Asserts ladbares Modul Acsl.so Fehler beim Öffnen von '/ home/giacomo/llvmtmp/llvm-csfv/Debug + Asserts/lib/Acsl. so ': /home/giacomo/llvmtmp/llvm-csfv/Debug+Asserts/lib/Acsl.so: undefiniertes Symbol: _ZN12_GLOBAL__N_19Invariant10InvariantsE -load-Anforderung ignoriert. –
Ich vermute nicht, dass Sie das Wort "statisch" behalten haben, als Sie das aus Ihrer Header-Datei kopiert haben, oder? Es sollte nicht "statisch" in der CPP-Datei deklariert sein. Mein schlechtes für die Aufnahme. Das tut mir leid. – WhozCraig