2010-09-07 26 views
5

tôi có các thiết lập sau (hy vọng đây không phải là quá trần một ví dụ):tài liệu tham khảo không xác định khi sử dụng extern

Ah

typedef std::map<unsigned int, float> MyClass; 
extern MyClass inst; 

A.cpp

MyClass inst; 

Bh

#include <A.h> 
void foo(); 

B.cpp

#include <B.h> 
void foo { 
    inst.myClassFunc(); 
} 

Bây giờ, khi tôi sử dụng inst trong B.cpp tôi nhận được undefined reference to inst.

Bất kỳ ý tưởng nào về cách sửa lỗi này?

+0

Bạn có #include định nghĩa 'lớp MyClass' trong B.cpp không? –

+0

Bạn nên bao gồm thông báo lỗi trình biên dịch đầy đủ trong bài đăng của mình. –

Trả lời

0

Đây là một ví dụ quá trần để tìm hiểu điều gì đang xảy ra. Tuy nhiên, dựa trên trên nó hoàn toàn có thể là khi nó chạm vào dòng thất bại trình biên dịch không có kiến ​​thức về những gì thực sự trong MyClass và do đó không thể giải quyết MyClassFunc.

Chúng tôi sẽ cần phải xem định nghĩa của MyClass và biết nó là nơi để trả lời chắc chắn.

+0

được cập nhật về 'MyClass' –

0

Bạn phải biên dịch các tập tin nêu trên A.cpp như

g++ -c A.cpp 
g++ -c B.cpp 

và sau đó trong khi tạo ra thực thi, bạn nên viết lệnh như sau:

g++ A.o B.o 
+1

Hoặc trong một bước, 'g ++ A.cpp B.cpp'. –

0

Từ mã ví dụ cơ bản bạn đăng tôi muốn nói rằng bạn đã quên #include <B.h> trong tệp B.cpp của bạn.

9

Tôi biết câu hỏi này là cũ, nhưng nó vẫn có thể hữu ích cho ai đó.

Các biến toàn cục (ở đây: MyClass inst) không nênexterncho đơn vị biên soạn trong đó xác định nó (ở đây: A.cpp)

Một cách để đạt được điều này:

  • khai báo biến toàn cục của bạn trong một tiêu đề riêng biệt (giả sử global.h) và bao gồm tiêu đề này trong * cpp bằng cách sử dụng se.
  • loại bỏ các từ khóa extern cho đơn vị biên soạn mà xác định họ (ví dụ: với #ifdef):

global.h trông giống như:

#ifdef A_H_ 
    #define EXTERN 
#else 
    #define EXTERN extern 
#endif 

EXTERN MyClass inst; 

khi A.h trông giống như:

#ifndef A_H_ 
#define A_H_ 

// your header content (without globals) 

#endif /* A_H_ */ 

và A.cpp:

#include "A.h" 
#include "global.h" // after A.h inclusion, we need A_H_ definition 

Hy vọng nó sẽ giúp!

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