Tôi có tập tin .h này:biến có liên kết nội bộ nhưng không được định nghĩa
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
Khi tôi biên dịch kêu vang nói:
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];
vấn đề ở đây là gì?
Bạn có biến lớp tĩnh. Nó có được định nghĩa đúng ở mọi nơi cho độ phân giải liên kết (câu hỏi được nạp hay không, vì thông điệp bạn đang hiển thị làm cho câu trả lời khá rõ ràng). Các thành viên lớp tĩnh cần được khai báo trong lớp, sau đó được định nghĩa ngoài lớp. Bạn cần một 'static DenseMap> Invariant :: Invariants;' trong tệp .cpp liên quan cho tiêu đề này. –
WhozCraig
Nếu tôi làm điều đó, trong giai đoạn liên kết xuất hiện: llvm [0]: Liên kết Debug + Asserts Mô-đun có thể nạp Acsl.so Lỗi khi mở '/ home/giacomo/llvmtmp/llvm-csfv/Gỡ lỗi + Asserts/lib/Acsl. vì vậy ': /home/giacomo/llvmtmp/llvm-csfv/Debug+Asserts/lib/Acsl.so: biểu tượng không xác định: _ZN12_GLOBAL__N_19Invariant10InvariantsE yêu cầu tải bị bỏ qua. –
Tôi không cho rằng bạn giữ từ "tĩnh" khi bạn sao chép từ tệp tiêu đề của bạn, phải không? Nó sẽ * không * là 'static' được khai báo trong tệp .cpp. Xấu của tôi để bao gồm nó. Xin lỗi vì điều đó. – WhozCraig