2015-01-29 2 views
0

Windows (Mac)로 포팅하는 C++로 작성된 게임 엔진이 있습니다. C++ 11과 OpenGL을 사용하며 모든 목적과 목적을 위해 실행됩니다!DLL에서 C++ 함수를 사용하여 액세스 위반이 발생했습니다.

런타임에 게임 .exe에 암시 적으로 연결된 내 게임 엔진 용 DLL을 사용하고 있습니다.

First-chance exception at 0x00007FF9CF988830 (PocoFoundation64.dll) in TestEquinox.exe: 0xC0000005: Access violation reading location 0x000000136A4FF000.

: 나는 리소스 파일을 찾으려면 DLL, FileSystem에서 유틸리티 클래스를 사용하려고 (텍스처를,하지만 난 그게 중요하다고 생각하지 않습니다) 때 문제는, 내가이 오류가있다

Poco::Path FileSystem::Get(const std::string &filename) { 
std::vector<Poco::Path> paths = { 
     filename, 
     ResourceFolder()/filename //<<<<< ERROR HERE 
    }; 

    for (const Poco::Path &path : paths) { 
     try { 
      if (Poco::File(path).exists()) { 
       return path; 
      } 
     } catch (...) { } 
    } 

    Logger("FileSystem", std::cerr) << "Could not find file '" << filename << "'!"; 
    return {}; 
} 

비주얼 스튜디오가를 보여줍니다 : 나는 (이 파일 이름/부분 경로를 취할 수 있도록 설계하고 전체 경로를 찾기 위해 다양한 장소에서 보이는 것) DLL에서 내 FileSystem 클래스의 메서드를 호출 할 때

문제는 온다 오류가 ResourceFolder()이라는 동일한 클래스의 또 다른 메서드 인 DLL에서도 발생합니다. 이 때문에 나타납니다 그것의 모습에서

Poco::Path FileSystem::ResourceFolder() { 
    Poco::Path userData; 

    //--SNIP-- (other OS's #ifdef'd here) 
    // GAME->StartupPath is a std::string containing the exe's parent folder 
    userData = (Poco::Path(GAME->StartupPath).parent()/"Resources").makeDirectory(); 
    //--SNIP-- (and here) 

    try { 
     if (!Poco::File(userData).exists()) { 
      Poco::File(userData).createDirectories(); 
     } 
    } catch (...) {} 

    return userData; 
} 

, 그것은 Poco의 데이터 유형이 제대로 인스턴스화되지 함께 할 수있어? 필자는 동일한 컴파일러 설정 (64 비트, 멀티 바이트 문자 세트, VS2013)을 사용하여 소스에서 빌드 했으므로 이름 변환/데이터 레이아웃 문제가 될 수있는 방법을 알지 못합니다.

한 가지 더 알아 두어야 할 점은 DLL의 전체 FileSystem 클래스를 내 게임 프로젝트의 로컬 클래스 인 FileSystem2으로 복사했습니다. 같은 코드 임에도 불구하고 동일한 매개 변수를 사용하여 FileSystem2::Get을 올바르게 작동하고 충돌하지 않고 호출했습니다.

누군가가 올바른 방향으로 나를 가리킬 수 있다고 생각하니?!

+0

'64 비트 멀티 바이트 문자 세트, VS2013' 런타임 라이브러리 설정도 확인해야합니다. – PaulMcKenzie

+0

좀 더 자세히 설명해 주시겠습니까? Visual Studio에서 런타임 라이브러리에 대한 설정은 어디에서합니까? – Javawag

+0

'프로젝트 속성 -> C/C++ -> 코드 생성 -> 런타임 라이브러리'이것은 컴파일하고있는 모든 모듈과 일치해야합니다. – PaulMcKenzie

답변

1

일반적으로 이와 같은 오류는 모듈에서 사용하는 호환되지 않는 런타임 라이브러리 사용으로 인해 발생합니다. Visual Studio 속성의 모든 모듈에 대해 다음을 확인하십시오.

Project Properties -> C/C++ -> Code Generation -> Runtime Library.

런타임 설정 (다중 스레드 DLL, 다중 스레드 디버그 DLL 등)은 컴파일하는 모든 모듈과 일치해야합니다. 일치하지 않으면 하나의 런타임을 선택하고 해당 런타임을 사용하여 모든 모듈을 다시 작성하십시오.

+0

그래,이게 그거야. 디버그 용으로 빌드하는 동안 종속 버전 중 하나 (PocoFoundation.dll 대 PocoFoundationd.dll)의 릴리스 버전에 연결되었습니다. 즉, 런타임 설정이 호환되지 않습니다! – Javawag

관련 문제