2012-11-26 4 views
0

I가 다음 파일을
MAIN.CPP되지 않은 외부 기호 (LNK2019)

#include "impl.h" 

SomeInterface* CreateInterface() 
{ 
    return new Impl; 
} 
... 

impl.cpp

#include "interface.h" 

class Impl: public Interface 
{ 
    ... 
}; 

impl.h

class Interface 
{ 
    ... 
}; 

Interface* CreateInterface(); 

interface.h

#include "Interface.h" 
int main() 
{ 
    CreateInterface(); 
} 

원래 내 프로젝트가 좋아 보였습니다. this. 그러나 테스트 목적으로 모든 파일은 이제 같은 프로젝트에 있습니다.
컴파일 할 때 CreateNterface가 해결되지 않는다는 LNK2019 오류가 발생합니다. VS 2008을 사용하고 있습니다. 무엇이 잘못되었는지 전혀 모릅니다.

+0

'impl.cpp'가 컴파일 되나요? 함수 이름을 잘못 입력하지 않았습니까? –

+0

@LuchianGrigore 철자가 잘못되었습니다. 컴파일되고 있는지 확인하는 방법은 어떻게 할 수 있습니까? 내 솔루션의 소스 파일 섹션에 파일을 저장하면 자동으로 컴파일해야한다는 것을 알고 있습니다. – atoMerz

+1

파일에서 컴파일해서는 안되는 더미 코드를 추가하는 것은 어떻습니까? 근원에'this는 컴파일해서는 안된다 '라는 줄을 입력하십시오. 오류가 없다면 컴파일되지 않습니다. –

답변

0

링커는 CreateInterface이 있고 함수이지만 실제 함수 자체를 찾을 수 없다는 것을 알려줍니다. 그래서 당신이 당신의 프로젝트에 impl.cpp를 포함하지 않는다고 생각합니다. 컴파일되지 않습니다.

2

CreateInterface() 선언을 여러 개 사용 하시겠습니까?

Interface.h

Interface* CreateInterface(); 

Impl.cpp 이들

SomeInterface* CreateInterface() 

하나 (후자)이 실제로 구현되는 것으로 보인다. 당신은 이름 모호성이 있고 컴파일러가 틀린 것을 선택하고있는 것으로 보인다.

동일 매개 변수 목록 및 반환 유형을 Interface.h의 프로토 타입으로 사용하여 impl.cpp에 CreateInterface()을 정의하십시오. 나는 보통 그런 짐승 같은 디자인을 묵과하지 않겠지 만 그것이 당신이 원하는 것처럼 보입니다.

Impl.cpp는

Interface* CreateInterface() // note the return type 
{ 
    return new Impl; 
} 

솔직히 나는 당신이 두 (Interface.h의 선언과 Impl.cpp에서 구현) 사이의 유일한 차이는있어 고려,이 심지어 컴파일을 믿을 수 없어 반환 유형의 차이이며 컴파일러가 그 모든 것을 토해 야하므로 아직 표시하지 않는 것이있을 수 있습니다.

+0

그건 오타 였지만 멋진 일이었습니다. :) – atoMerz