variable hat interne Bindung, aber nicht definiert

Habe ich diese .h-Datei:

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 clang 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 hier das problem?

  • Sie haben eine statische Klassenvariable. Ist es korrekt definiert ist überall für Gestänge-Auflösung (Fangfrage, da die Nachricht Sie sind zeigt, macht die Antwort ziemlich offensichtlich). Statische Klassenmember deklariert werden müssen in-class -, dann definiert die out-of-class. Sie brauchen eine static DenseMap<Function*, DenseMap<Instruction*,Invariant*> > Invariant::Invariants; im Zusammenhang .cpp-Datei, die für diesen header.
  • Wenn ich das mache, in der Verknüpfung von phase erscheint: llvm[0]: die Verknüpfung von Debug+Behauptet Loadable Module Acsl.also Fehler beim öffnen von '/home/giacomo/llvmtmp/llvm-csfv/Debug+Versichert/lib/Acsl.so': /home/giacomo/llvmtmp/llvm-csfv/Debug+Versichert/lib/Acsl.so: undefined symbol: _ZN12_GLOBAL__N_19Invariant10InvariantsE -load-Requests ignoriert.
  • Ich glaube nicht, dass Sie gehalten, das Wort "statisch", wenn Sie kopiert aus der header-Datei hast du? Es sollte nicht static deklariert .cpp-Datei. Meine schlecht für die einschließlich es. Tut mir Leid, dass.
  • Ja, entfernt habe ich das `static', aber der gleiche Fehler
  • Die einzige andere Sache, die ich sehe, könnten die Dinge gehen kerplop ist der anonyme namespace. Ich kann kaum behaupten, zu wissen, dass Ihre angegebenen Verhalten im übergang Einheiten (selbst wenn dort ist solch ein Ding) aber ich würde versuchen, zu verlieren, dass, wie gut. Anonyme namespaces sind wie Griechisch zu mir (den ich nie nutze). Ist dieser link kommen die Fehler von Ihr .so gebaut ist, dass die Definition dieser Klasse? oder ein separates Programm zu verwenden versuchen das so?
  • Super!!! Dass das Thema gelöst, ich hätte nie gedacht, dass das problem der anonymen ns. Danke!!!
  • Weder habe ich, bis ich die durchgelesen diese F&A kurz. Wie ich schon sagte; ich habe nie verwenden. Froh, dass es funktioniert.
  • Ich benutze anonmymous ns, da LLVM-Richtlinien schlagen vor, dass, und ich würde gerne bei Ihnen bleiben

Schreibe einen Kommentar