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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einfach definieren. Nach der definition der Klasse, aber vor dem Ende der anonymen namespace hinzufügen dieser Zeile:
Dadurch wird die statische member-in jeder übersetzungseinheit enthält dieser header (das ist okay, denn es ist in der anonymen namespace, die einzigartig für jede übersetzungseinheit). Das ist wahrscheinlich nicht das, was Sie wollen, aber das folgt aus der Definition
Invariant
in einem anonymen Namensraum. Wenn Sie eine benannte namespace statt, Sie können die definition vonInvariants
in eine source-Datei und nur ein Objekt geteilt durch den gesamten code.