Visual C++ CRT(C Runtime DLL: msvcr...dll)에 대한 의존성 제거 - 두 번째 이야기
이전 글("CRT(C Runtime DLL: msvcr...dll)에 대한 의존성 제거")에서 설명한 적이 있지만 근래의 기준으로 간단하게 다시 한번 정리했습니다.
기본적으로, Visual C++로 Console Application을 만들면,
#include <iostream>
int main()
{
std::cout << "Hello World!\n";
}
빌드 후 dumpbin으로 확인했을 때,
c:\temp> dumpbin /IMPORTS ConsoleApplication1.exe
Microsoft (R) COFF/PE Dumper Version 14.41.34120.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file ConsoleApplication1.exe
File Type: EXECUTABLE IMAGE
Section contains the following imports:
MSVCP140D.dll
140021150 Import Address Table
1400216A0 Import Name Table
0 time date stamp
0 Index of first forwarder reference
3CD ?good@ios_base@std@@QEBA_NXZ
...[생략]...
VCRUNTIME140_1D.dll
1400212D0 Import Address Table
140021820 Import Name Table
0 time date stamp
0 Index of first forwarder reference
0 __CxxFrameHandler4
VCRUNTIME140D.dll
140021228 Import Address Table
140021778 Import Name Table
0 time date stamp
0 Index of first forwarder reference
8 __C_specific_handler
...[생략]...
ucrtbased.dll
140021330 Import Address Table
140021880 Import Name Table
0 time date stamp
0 Index of first forwarder reference
E5 _execute_onexit_table
...[생략]...
KERNEL32.dll
140021000 Import Address Table
140021550 Import Name Table
0 time date stamp
0 Index of first forwarder reference
1C5 FreeLibrary
...[생략]...
Debug/Release 빌드에 따라 이런 의존성이 생깁니다.
[Debug 빌드 시]
MSVCP140D.dll, VCRUNTIME140_1D.dll, VCRUNTIME140D.dll, ucrtbased.dll
[Release 빌드 시 (디버그용 DLL에서 "D" 글자만 제거)]
MSVCP140.dll, VCRUNTIME140_1.dll, VCRUNTIME140.dll, ucrtbase.dll
CRT 함수를 사용하면서도, (배포 등의 편의를 위해) DLL에 대한 의존성을 제거하려면, 간단하게는 그냥 정적 빌드를 하면 됩니다.
이를 위해 C++ 프로젝트 속성 창에서 "C/C++" / "Code Generation" / "Runtime Library"를 "Multi-threaded (/MT)"로 설정합니다. (디버그 빌드인 경우 "Multi-threaded Debug (/MTd)"로 설정)
이후 다시 빌드하고 dumpbin으로 확인하면 오직 Kernel32.dll에만 의존성이 있는 것을 확인할 수 있습니다.
리눅스의 경우에는 CRT 의존성을 없애는 것이 쉽지 않지만 윈도우의 경우에는 CRT와 Win32 API DLL이 분리가 돼 있어서 꽤나 간단하게 처리할 수 있습니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]