2017-11-22 18 views
0

shared_ptr을 반환하는 함수를 내보내는 dll을 사용하고 있습니다.LINK2019 : shared_ptr을 반환하는 함수의 확인되지 않은 외부 기호 <int>

dll을 프로젝트에서 코드 :

#ifdef _WRAPPER 
    #define WRAPPER_DLL_EXT __declspec(dllexport) 
#else 
    #define WRAPPER_DLL_EXT __declspec(dllimport) 
#endif 


std::shared_ptr<int> WRAPPER_DLL_EXT func() 
{ 
    return std::make_shared<int>(5); 
} 

DLL을 사용하여 프로젝트에서 코드 :

std::shared_ptr<int> myPointer = func(); 

내가 func()에 대한 오류 LINK2019: unresolved external symbol를 얻을.

DLL이 프로젝트는 DLL을 사용하여 프로젝트가 비주얼 스튜디오 2010 툴 세트를 사용하는 반면, 툴셋비주얼 스튜디오 2013를 사용하여 컴파일됩니다.

VS2010 도구 세트를 사용하여 dll을 컴파일하면 오류가 발생하지 않지만 실제로 VS2010과 함께 dll을 컴파일 할 수 없도록 구현시 VS2013 기능을 사용하고 있습니다. 사용중인 프로젝트를 VS2013으로 업그레이드 할 수 없습니다.

VS2013 툴 세트을 (를) 사용하여 프로젝트를 만들 수 있습니까?

편집 : 내가 변경하면 shared_ptr에서 unique_ptr으로 변경됩니다 (물론, 필요한 것은 아닙니다).

답변

3

짧은 답변 : 당신의 DLL에 대한

사용 순수 C의 API 또는는 DLL과 실행에 대해 동일한 도구 세트 버전을 사용

긴 대답 :

C++은 ABI과 다른 컴파일러 버전에서 호환되지 않습니다. 이것은 툴 세트의 다른 버전이 호환 가능한 바이너리를 생성하지 않는다는 것을 의미합니다. C++ 이름은 다르게 mangled 될 수 있고 메모리 레이아웃은 다릅니다. 링커가 올바른 함수를 찾을 수 없거나 약간의 런타임 오류가 발생할 수 있습니다. ABI와 호환되는지 확인하는 유일한 방법은 도구 집합 버전간에 ABI 안정화가 보장되는 언어 인 C를 사용하는 것입니다.

이것은 기본적으로 DLL을 통해 노출되는 Windows API 일반 C 구조와 물건을 가진 C 함수입니다.

Some more info on StackOverflow