2013-04-01 2 views
3

로 마이그레이션 한 후 내가 (다른 사람들)를 포함하는 VS2010 솔루션을 가지고, 다음 프로젝트 :LNK 2022 : 일관성 레이아웃 정보, VS2010

  • Native.DLL (네이티브 C++ 프로젝트 정적으로 타사에 대한 링크

    using namespace std; 
    
    bool Native::CalcSomething(double* result, string& errorMsg); 
    
    • : STL)

    의사 코드 (매우 단순화)을 포함 LIB, ITK, (아주 간단)

의사 코드

bool Wrapper::WrappedCalcSomething([System::Runtime::InteropServices::OutAttribute] double[] result,[System::Runtime::InteropServices::OutAttribute] System::String^ errorMsg) 
{ 
    Native* ntv = new Native(); 

    std:string error; 
    pin_ptr<double> resultPtr = &result[0]; 

    bool success = ntv->CalcSomething(resultPtr, error); 

    errorMsg = gcnew System::String(error.c_str()); 

    return success; 
} 

이을 :합니다 (Native.DLL에 대한 호출에서 문자열을 동적으로 Native.DLL에 연결하고 표준을 사용하여 C++/CLI 프로젝트) Wrapper.DLL 나는이 문제에 대한 찾을 수있는 거의 모든 스레드를 읽고 및 시도

2> Generating Code... 
2>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std.logic_error): (0x02000049). 
2>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std.domain_error): (0x0200004a). 
2>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std.invalid_argument): (0x0200004b). 
2>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std.length_error): (0x0200004c). 
2>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std.out_of_range): (0x0200004d). 
2>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std.runtime_error): (0x0200004e). 
2>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std.overflow_error): (0x02000050). 
2>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std.underflow_error): (0x02000051). 
2>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std.range_error): (0x02000052). 
2>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std._Locinfo): (0x02000054). 
2>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_Locimp): (0x02000059). 
2>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (failure): (0x02000068). 
2>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std._String_val<char,std::allocator<char> >): (0x02000097). 
2>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std._String_val<wchar_t,std::allocator<wchar_t> >): (0x02000099). 
2>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (lconv): (0x020000ce). 
2>LINK : fatal error LNK1255: link failed because of metadata errors 

: 컴파일과 VS2008 (64)에 완벽하게 연결되어 있지만 (여러 가지 이유로) VS2010로 마이그레이션 한 후, 링커는 다음과 같은 오류를 제공합니다 :

  • 깨끗하고
  • Move the headers around 재 -이 WINDOWS.H에 대한 참조가없는 나는 (이 모든 파일 될 일이 Wrapper.DLL에 아무런 영향을 미치지
  • Using the /clr flag only on the files that need it에 주위의 #include 라인을 이동 시도 프로젝트에서). 문제는 Wrapper.DLL에 의해 호출되어야하는 Native.DLL의 public 메서드가 서명에 std : string 매개 변수를 포함한다는 것입니다. 이로 인해 STL 참조를/clr 컴파일 범위에서 분리하는 것이 어려워 짐
  • /MDd (및/MD 시도)이있는 (모든 항목이 ITK, 타사 lib 포함)을 컴파일 중입니다.이 설정을 변경합니다 유일한 "솔루션"내가 생각할 수있는 /Zp에 또는 프라 그마 팩 어디

을 사용하고 내가 볼 수없는

  • 일에 영향을 미칠 것 같지 않습니다 것은 사용하지 Native.DLL의 방법을 변경하는 것입니다 std : 문자열을 매개 변수로 사용합니다 (예 : char * 대신 사용). 그러나 모든 C++/CLI 래퍼에서 STL을 사용하는 것을 피하기 위해 솔루션과 같이 보이지 않습니다. 거기 더 나은 방법이어야합니다!

    참고 : 나는이 문제를 "디버그하는"방법 (link)에 대해 알고 있지만 실수하지 않는 한 문제의 원인이 std : string이라는 것을 알고 있다고 생각합니다.

  • +0

    'wrapper.dll'도 재구성 했습니까? – SomeWittyUsername

    +0

    예, 새로운 "수정"을 시도 할 때마다 기본 프로젝트와 래퍼 프로젝트를 다시 빌드합니다. – Kohanz

    +0

    프로젝트를 어떻게 이전 했습니까? VS2008에서 자동으로 변환 되었습니까? – SomeWittyUsername

    답변

    4

    나는 그것을 알아 냈다.

    필자는 CMake 파일 중 하나에서 구문 변경을 수행 했었습니다. 이전에 어떤 일이 일어 났는지 (필자는 본질적으로 CMake 편리한 변수를 사용하고있었습니다)와 기능적으로 동일하다고 생각했습니다. 그러나 이것은 물론 의도하지 않은 결과를 낳았으며 결과 프로젝트 파일은 동일하지 않았습니다.

    특히, Wrapper.DLL 프로젝트는 이제 링크 할 필요가없는 타사 ITK 라이브러리에 연결되었습니다 (Native.DLL 만 필요합니다).

    CMake를 다시 변경하고 프로젝트를 올바르게 생성 한 후, 두려운 LNK2022가 사라졌습니다. 나는 낭비하는 그 모든 시간들에 대해서만 비난 할뿐입니다 ...

    +0

    아, 어쨌든 당신이 그것을 알아 낸 것 같습니다! – aardvarkk