2010-07-21 3 views
1

Visual Studio 2008을 사용하여 dll에 외부 C++ 코드를 컴파일 중입니다. 코드가 extern "C"로 묶입니다.Visual Studio 2008을 사용하여 x86에서 x64 dll 컴파일

나는 32 비트 컴퓨터에서 64 비트 dll을 만드는 크로스 컴파일이므로, "Configuration Manager"에서 x64를 "능동 솔루션 플랫폼"으로 사용하고 있습니다.

내 dll이 성공적으로 컴파일되고 연결됩니다. 그러나 Dependency Walker (depends.exe)에서 열면 이상한 것이 있습니다. 내 dll은 64 비트로 표시되어 있습니다. 내 dll 그러나 32 비트있는 C : \ windows \ system32 \ ntdll.dll 및 C : \ windows \ system32 \ kernel32.dll 따라 달라집니다! 종속성 워커는 다음과 같은 오류 메시지를 표시합니다. "오류 : 암시 적으로 종속 모듈에서 내보내기 기능이 없어서 적어도 하나의 모듈에 가져 오기가 완료되지 않았습니다. 오류 : CPU 유형이 다른 모듈을 찾았습니다."

여기에 무슨 문제가 있습니까?

미리 답변 해 주셔서 감사합니다.

+0

64 비트 시스템에서 이전 버전과의 호환성을 위해 system32의 파일은 실제로 64 비트 시스템입니다. 따라서 64 비트 컴퓨터에서 ntdll.dll과 kernel32.dll은 실제로 64 비트 버전입니다. 32 버전은 SysWow64에 있습니다. –

답변

2

system32의 dll 파일이 32 비트 시스템에서 32 비트이기 때문에 종속성 워커에서 오류가 발생합니다. 64 비트 버전의 Windows에서 실행하면 정상적으로 작동합니다.

아마도 오해는 system32의 이름에서 비롯된 것일 수 있습니다. 그것은 반드시 32 비트 파일을 포함하지는 않습니다 - 운영 체제의 비트 크기와 일치하는 파일을 포함하므로 32 비트 Windows에서 sytem32은 32 비트 DLL을 포함하고, 64 비트 Windows에서는 system32이 64 비트 DLL을 포함합니다.

은 그래도 더 복잡해진다 - 64 비트 Windows 32 개 비트 프로세스를 실행할 수 있으며 32 비트 프로세스는이 SysWOW64 (예 system32에 포함 된 64 비트 DLL로 리디렉션됩니다 액세스 Windows의 64 비트 버전에 system32를 액세스하는 경우 SysWOW64은 32 비트 dll을 포함합니다).

+0

오류 메시지는 실제로 32 비트 DLL에 x64 내용이 없기 때문에 32 비트 DLL에서 필요한 모든 가져 오기를 찾을 수 없으므로 실제로 컴파일 된 DLL이 64 비트임을 확인한 것입니다. . – rubenvb

1

DLL은 ntdll.dllkernel32.dll에 따라 다릅니다. 종속성 워커는 LoadLibrary 함수의 조회 규칙에 따라 종속성 찾기를 시도합니다. 그리고 그것들은 system32 디렉토리에 있지만 32 비트 시스템에서는 32 비트입니다.

0

64 비트 버전의 종속성 워커를 사용하여 64 비트 버전의 dll을 엽니 다. 모듈이 x64 용으로 올바르게 컴파일 된 경우 "오류 : 다른 CPU 유형을 가진 모듈을 찾았습니다"라는 오류 메시지가 더 이상 표시되지 않습니다.

+0

그는 OS가 32 비트라는 것을 제외하고는 64 비트 버전의 종속성 워커를 실행할 수 없다는 것을 언급했습니다. – ehambright

관련 문제