2013-04-08 18 views
7

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ì?

+1

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

+0

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. –

+0

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

Trả lời

6

Chỉ cần xác định. Sau khi định nghĩa lớp nhưng trước khi kết thúc không gian tên vô danh thêm dòng này:

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

Điều này sẽ tạo ra các thành viên tĩnh trong mỗi đơn vị dịch thuật bao gồm tiêu đề này (đó là chấp nhận vì nó là trong không gian tên vô danh, mà là duy nhất cho mỗi đơn vị dịch). Đó có lẽ không phải là những gì bạn muốn, nhưng điều đó sau khi xác định Invariant trong một không gian tên ẩn danh. Nếu bạn sử dụng một không gian tên được đặt tên thay vào đó, bạn có thể đặt định nghĩa Invariants vào tệp nguồn và chỉ có một đối tượng được chia sẻ bởi tất cả mã.

Các vấn đề liên quan