2012-09-07 4 views
-1

그래서 정적 멤버 내 헤더 파일이 있습니다C++ 클래스의 정적 멤버

#include "ProfileManager.h" 

namespace Engine 
{ 
    map<const char*, vector<float>> ProfileManager::profiles; 
    map<const char*, vector<float>>::iterator ProfileManager::it; 
    pair<map<const char*, vector<float>>::iterator, bool> ProfileManager::ret; 
} 

링커는 항상 정적 멤버는 것에 대해 불평 :

#ifndef PROFILE_MANAGER_H 
#define PROFILE_MANAGER_H 

#include <map> 
#include <vector> 

using namespace std; 
using std::vector; 

namespace Engine 
{ 
    class ProfileManager 
    { 
    private: 
     static map<const char*, vector<float>> profiles; 
     static map<const char*, vector<float>>::iterator it; 
     static pair<map<const char*, vector<float>>::iterator, bool> ret; 
    }; 
} 

#endif 

그리고 내 CPP 파일에

내가 정의가를 비록 내가 cpp 파일에서 정의한 미해결 외부 (LNK2001). 왜 어떤 아이디어?

+3

나는 컴파일러가 누락 된 세미콜론에 대해 불평하지 않는다는 것에 더 놀랐습니다! –

+1

오른쪽 시프트 연산자를 반복적으로 사용하는 것은 말할 것도 없습니다. – WhozCraig

+1

당신은 cpp 파일을 컴파일하고 있습니까? –

답변

2

이러한 종류의 오류는 대개 링커에게 cpp 컴파일 결과 인 obj 파일이 제공되지 않을 때 발생합니다.

출력 디렉토리에서 ProfileManager.obj를 찾으십시오. 존재하지 않는다면, 잘못된 것이 있습니다. Luchian Grigore가 제안한 것처럼 아마도 cpp 파일이 컴파일되지 않습니다. 링커가 매개 변수에 obj 파일을 제공하지 않을 수도 있습니다. Visual Studio를 사용하는 경우 cpp 파일이 프로젝트의 일부인지 확인하십시오. 다른 환경에서는 링커가 호출 된 명령을 참조하십시오.

Visual Studio를 사용하는 경우 프로젝트 속성 -> 링커 -> 명령 줄을 열고 추가 옵션에서/VERBOSE를 추가 할 수 있습니다. 그런 다음 출력 창을 열고 프로젝트를 다시 컴파일하십시오. (Craig에게 감사의 말을 전한다.)

한 가지 더 많은 시나리오가있었습니다. 헤더 파일을 다른 프로젝트에 포함 시켰으며 ProfileManager.cpp가있는 프로젝트를 참조하지 않고 빌드하려고했습니다.

+1

만약 당신이 정말로 그 심볼들을 검색하고 있는지 알고 싶다면, VC++에서 링커 출력 셋팅 config에 대해 꽤 사소한 것입니다. 이와 같은 문제가 발생할 때마다 언제든지 ID를 해결하기 위해 검색되는 내용을 파악할 수 있습니다. – WhozCraig