2009-03-01 5 views
1

Visual Studio 2008에서 프로젝트를 빌드하려고합니다. 링커 오류가 많아서 정말 귀찮습니다. 내 응용 프로그램은 고유 ANSI C++ 만 사용하는 Win32 콘솔 응용 프로그램입니다.헤더 파일에있는 클래스의 개인 멤버와의 링커 오류

이들은 모두 동일한 패턴의 링커 오류입니다. 링커 오류는 내 자신의 헤더 파일에 정의한 클래스의 모든 단일 개인 정적 데이터 멤버와 관련이 있습니다.

나는 이것이 아마도 C++의 간단한 사실이라고 생각하고 있습니다. 이미 알고 있지 않습니까?

예 : 나는 SingleDelay 멤버 클래스의 함수 정의 내에서 SingleaysDelay의 멤버를 Delays.cpp 파일로 참조합니다. 예 :

SingleDelay::tick(void *output, void *input, int nbufferFrames)<br>{ 
    //.. code here<br> 
    x = dry * castInput + wet * castInput;<br> 
} 

오류 38 오류 LNK2001 : 확인되지 않은 외부 기호 "개인 정적 더블 SingleDelay :: 건조"(건조 @ SingleDelay @@ 0NA?) Delays.obj 지연에 SingleDelay의 testall

정의를 .h :

class SingleDelay{ 

    private: 
     static double dry; //% of dry signal<br> 
     static double wet; //% of wet signal<br> 
     static unsigned int delay; //Delay in milliseconds<br> 
     static int delayCell; //Index in the delayBuffer of the delay to add<br> 
     static double *delayBuffer; //Delay buffer is 1 second long at sample rate SAMPLE_RATE<br> 
     static unsigned int bufferCell; //Pointer to the current delay buffer cell<br> 

    public: 

     //Tick function 
     static void tick(void *output, void *input,int nBufferFrames); 

     //Set and Get functions 
     static void setSingleDelay(double tDry, double tWet, unsigned int tDelay); 
     static void setSingleDelay(void); 

     static void setDry(double tDry); 
     static void setWet(double tWet); 
     static void setDelay(unsigned int tDelay); 

     static double getDry(){ return dry;} 
     static double getWet(){ return wet;} 
     static unsigned int getDelay(){ return delay;} 

     static void initializeDelayBuffer(){ 
      destroyDelayBuffer(); 

      delayBuffer = new double[bufferLength]; 
     } 
     static void destroyDelayBuffer(){ 
      delete[ ] delayBuffer; 
     } 
}; 
+0

링크 오류를 나열 할 수 있습니까? –

+0

Yehha, 정확한 링커 오류를 게시하고 싶을 수 있습니다. 그래서 우리는 무엇이 그럴 수 있는지 제안 해 드릴 수 있습니다. –

+0

예, 방금 깨달았습니다. 두 가지 예제 오류와 일부 관련 코드를 추가했습니다. – Rich

답변

2
  1. 아마도 라이브러리를 추가하지 않았고 프로젝트 정의에 사용하는 라이브러리의 경로를 포함 했습니까?
  2. C++ 오류는 항상 재미있게 보입니다. 아니. 어떤 경우 든 정적 변수를 어디서나 초기화합니까? .cpp 파일에서이 작업을 수행해야합니다. 그리고 정적 변수를주의해서 사용하는 것을 잊지 마십시오. 그것들은 실제로 변장의 글로벌 변수이며, 멀티 스레딩과 같은 미래의 변경을 더 어렵게 만들 수 있습니다.
+0

2. 그래, 나는 그것이 문제를 일으킨 정적 변수의 초기화라고 생각했습니다. 반드시 .cpp로 끝내야합니다. 또는 .h 파일의 클래스 정의 다음에 할 수 있습니까? 초기화 된 값은 실제로 클래스를 사용할 때 실제로 덮어 쓰여 지므로 나에게별로 중요하지 않습니다. – Rich

+0

정적 사용에 관해서는 모든 지연 클래스를 정적으로 만들었습니다. 왜냐하면 제 목적을 위해 사용자는 한 번에 하나씩 만 사용하기 때문에 클래스를 인스턴스화하는 것은 불필요한 것처럼 보이기 때문에 실제적으로 나는 정적으로 피하는 것을 소유하고 있습니다. – Rich

+0

좋아요, 변수를 다시 초기화하려고 시도했지만 이번에는 작동했습니다. 처음에 약간의 실수를 저지른 것 같았습니다. 모두 도와 줘서 고마워. 때로는 다른 사람들이 너를 똑같은 것을 두 번이나 해보라고 강요한다.). – Rich

0

.vppproj 파일에 .cpp 및 .h 파일을 추가해야합니다.

+0

그게 무슨 뜻인지 모르겠습니다. 필자는 .vcproj 파일을 텍스트 편집기 등으로 수동으로 편집하지 않습니다. 필자는 프로젝트의 솔루션 탐색기에서 헤더 파일 드롭 다운 메뉴에 필요한 모든 포함 파일을 드래그 앤 드롭했습니다. 또한 소스 파일 메뉴에서 찾을 수있는 * .cpp 파일을 저장합니다. – Rich

+0

나는 실제로 # 2에 대한 링커 오류를 해결하는듯한 .cpp 파일이 누락되었다. 나는 아직도 얻는 모든 # 1 유형의 링커 오류로 무엇을해야할지 확신하지 못한다. – Rich

+0

프로젝트 -> 파일 추가로 이동 한 다음 끌어서 놓기 대신 .cpp 및 .h를 선택하십시오. – Vinay

6

이들은 모두 동일한 패턴의 링커 오류입니다. 링커 오류는 내 자신의 헤더 파일에 정의한 클래스의 모든 개인용 정적 데이터 멤버와 관련이 있습니다.

모든 정적 데이터 멤버 해야는 .cpp 파일 의 정의를 가지고있다.

오류 38 오류 LNK2001 : 확인되지 않은 외부 기호 "개인 정적 더블 SingleDelay :: 건조"(? 건조 @ SingleDelay @@ 0NA) Delays.obj testall

링커는 당신을 말하고있다 해당 변수에 대해 정의 된 저장소가 없습니다. 이 줄 해야 정확히 하나 개의 .cpp 파일에 어딘가에 표시는 비공개이기 때문에

double SingleDelay::dry = 0.0; 
0

아마 오류가 정적 필드의 가시성 범위에있다. 클래스 정의가 아닌 클래스 정의에 privete 정적 필드를 사용하는 코드를 작성하십시오. 클래스 정의에이 메소드를 작성하십시오.

class SingleDelay{ 
... 
int tick(void *output, void *input, int nbufferFrames) 
{ //.. code here 
x = dry * castInput + wet * castInput; 
} 
... 
}