2011-07-31 6 views
3

데이터 유형이 있으며 해당 유형의 변수를 인스턴스화 할 수 있습니다. 이 같은 :런타임에 "undefined symbol", C++

FetchAddr faddr(VirtualMemoryAddress(0x0a)); 

FetchAdr의 정의는 다음과 같습니다

struct FetchAddr { 
    VirtualMemoryAddress theAddress; 
    FetchAddr(VirtualMemoryAddress anAddress) 
    : theAddress(anAddress) 
    { } 
}; 

지금은 개인 (또는 공용)

class FLEXUS_COMPONENT(BPred) { 
    static FetchAddr faddr; 
    public: 
    FLEXUS_COMPONENT_CONSTRUCTOR(BPred) 
     : base(FLEXUS_PASS_CONSTRUCTOR_ARGS) 
    { 
     faddr = VirtualMemoryAddress(0x0a); 
    } 
    ... 
} 

이 매크로를 가정 변수가 정의되어있다 faddr 클래스가 정확히.

코드를 컴파일하고 아무 문제없이 연결할 수 있습니다. 그러나 프로그램을 시작하면 다음과 같이 표시됩니다.

"undefined symbol: _ZN6nBPred14BPredComponent8faddr" 

faddr에 대한 기호가 없습니다.

그 어떤 아이디어라도 있으십니까?

답변

2

정적 멤버를 선언 할 때 .cpp 파일과 같이 어딘가에 정의해야합니다. 또한이 파일에 링크해야합니다.


문제 번호 2 - FetchAddr에는 기본 생성자가 없습니다. 모든 FLEXUS_COMPONENT(BPred)에 의해 공유되는 faddr을 만듭니다

FetchAddr FLEXUS_COMPONENT(BPred)::faddr(VirtualMemoryAddress(0x0a)); 

: 당신은 클래스의 정적 멤버로 faddr을해야하는 경우

, 당신은 또한 마찬가지로 정의 할 때 그것을 값을 제공 할 필요가 사물.

오히려 각 개체가 faddr 변수의 복사본을 가지고 그것을 가지고 있다면, 당신이 비 정적하고 생성자에서 초기화 할 수 있습니다

class FLEXUS_COMPONENT(BPred)  { 
  FetchAddr faddr; 
   public: 
     FLEXUS_COMPONENT_CONSTRUCTOR(BPred) 
        : base(FLEXUS_PASS_CONSTRUCTOR_ARGS), 
      faddr(VirtualMemoryAddress(0x0a)) 
     { } 
   // ... 
}; 
+0

정적 변수를 피할 수있는 방법이 있습니까? "statis"키워드를 제거하려고했지만 컴파일 오류가 발생합니다 : BPredImpl.cpp : 36 : error : 'FetchAddr :: FetchAddr()'에 대한 호출과 일치하는 함수가 없습니다. – mahmood

+0

"비 정적"접근 방식을 시도했는데 제대로 작동합니다. – mahmood

3

다른 곳에서는 정적 변수를 정의해야합니다.

FetchAddr FLEXUS_COMPONENT(BPred) :: faddr; 

단일 TU.

+0

오류 : ':'토큰 앞의 예상 초기화 자 TU 의미? – mahmood

+0

TU = 번역 단위. 번역 단위는 전처리 기가 실행 된 후에 (그리고 모든'# include'd 파일이 확장 된 후에)'.cpp' 파일입니다. 기본적으로 소스 파일과 여기에 포함 된 모든 헤더입니다. – jalf

+1

@mahmood : 매크로는 클래스의 이름을 짓는 것이 아니라 일부 기본 클래스에서 매크로를 상속하기 때문에 발생합니다. 이러한 기본 클래스는이 의미로는 사용할 수 없습니다. 매크로 호출 대신 클래스의 실제 이름을 사용해야합니다. 매크로 사용은 끔찍합니다. – Puppy

2

을 시도해보십시오 그래서 그 -Wl,--no-undefined 컴파일 링커는 라이브러리 나 다른 종속물에 정의되지 않은 심볼이 하나라도 있으면 링크를 완료하지 않습니다.

faddr은 제대로 연결되지 않았으며 프로그램을 더 이상 보지 못하고 그 밖의 다른 것을 알기 어렵습니다.