VC++ X64 빌드 오류: error LNK2001: unresolved external symbol [COMDLL]_ProxyFileInfo
64비트 용 DLL을 만드는 데에는 보통 2가지 옵션을 조정해 주어야 합니다.
- 프로젝트 속성창: Platform 설정을 X64로 변경
- 프로젝트 속성창: Linker / Advanced - Target Machine 값을 "MachineX64 (/MACHINE:X64)"로 변경
그런데, COM 개체를 Proxy DLL과 병합하는 경우 - 즉, "_MERGE_PROXYSTUB" 전처리 상수가 정의된 프로젝트라면 64비트 용 DLL을 만들기 위해서 빌드해 보면 다음과 같은 오류가 발생합니다.
[그림 1: X64 용 DLL 빌드 시 오류 발생]
Error 2 error LNK2001: unresolved external symbol Dotnet_ProxyFileInfo dlldatax.obj Dotnet
Error 3 error LNK1120: 1 unresolved externals d:\...\bin\Debug\Dotnet.dll Dotnet
출력 창에는 다음과 같은 내용이 나옵니다.
1>------ Build started: Project: Dotnet, Configuration: Debug X64 ------
1> TestInfo.cpp
1> Creating library d:\...\Debug\Dotnet64.lib and object d:\...\bin\Debug\Dotnet64.exp
1>Dotnet64.exp : warning LNK4070: /OUT:Dotnet.DLL directive in .EXP differs from output filename 'd:\...\bin\Debug\Dotnet64.dll'; ignoring directive
1>dlldatax.obj : error LNK2001: unresolved external symbol Dotnet_ProxyFileInfo
1>d:\...\bin\Debug\Dotnet64.dll : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
오류 내용이 너무 일반적이어서 구글링을 해도 별다른 해법을 찾지 못했습니다.
하는 수 없이, 프로젝트 속성창에서 모든 항목의 "Command Line" 란에 설정된 옵션을 뒤져 보았습니다. 오호... 그런데, "MIDL"에 다음과 같은 빌드 옵션이 있는 것을 찾아냈습니다.
/D "_DEBUG" /W1 /nologo /char signed /env win32 /Oicf /h "Dotnet_i.h" /iid "Dotnet_i.c" /proxy "Dotnet_p.c" /tlb "Debug\Dotnet.tlb" /robust
"win32"라... 분명 문제가 될 것 같습니다. 게다가 MIDL 빌드에서 Proxy DLL 측의 소스 코드도 자동 생성되는 것을 생각해 보면 문제의 소지가 있어 보입니다.
그래서, 바꿔야 하는 옵션이 바로 아래의 "MIDL" / "General" / "Target Environment" 값입니다.
[그림 2: MIDL 빌드 옵션 조정]
"Microsoft Windows 32-bit (/env win32)" 값을 "Microsoft Windows 64-bit on x64 (/env x64)"로 바꿔주고 빌드하면 끝!
[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]