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.
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
을 올바르게 작동하고 충돌하지 않고 호출했습니다.
누군가가 올바른 방향으로 나를 가리킬 수 있다고 생각하니?!
'64 비트 멀티 바이트 문자 세트, VS2013' 런타임 라이브러리 설정도 확인해야합니다. – PaulMcKenzie
좀 더 자세히 설명해 주시겠습니까? Visual Studio에서 런타임 라이브러리에 대한 설정은 어디에서합니까? – Javawag
'프로젝트 속성 -> C/C++ -> 코드 생성 -> 런타임 라이브러리'이것은 컴파일하고있는 모든 모듈과 일치해야합니다. – PaulMcKenzie