Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (seongtaejeong at gmail.com)
홈페이지
첨부 파일
 

(시리즈 글이 4개 있습니다.)
VS.NET IDE: 66. 수동으로 구성해 본 VC++ 프로젝트 설정: ReleaseMinDependency
; https://www.sysnet.pe.kr/2/0/800

VC++: 67. CRT(C Runtime DLL: msvcr...dll)에 대한 의존성 제거
; https://www.sysnet.pe.kr/2/0/1437

C/C++: 168. Visual C++ CRT(C Runtime DLL: msvcr...dll)에 대한 의존성 제거 - 두 번째 이야기
; https://www.sysnet.pe.kr/2/0/13721

C/C++: 169. C/C++ - CRT(C Runtime) 함수에 의존성이 없는 프로젝트 생성
; https://www.sysnet.pe.kr/2/0/13722




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이 분리가 돼 있어서 꽤나 간단하게 처리할 수 있습니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 8/30/2024]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 46  47  48  49  50  51  52  53  [54]  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12621정성태5/1/202119434.NET Framework: 1053. C# - 특정 레지스트리 변경 시 알림을 받는 방법 [1]파일 다운로드1
12620정성태4/29/202123315.NET Framework: 1052. C# - 왜 구조체는 16 바이트의 크기가 적합한가? [1]파일 다운로드1
12619정성태4/28/202123211.NET Framework: 1051. C# - 구조체의 크기가 16바이트가 넘어가면 힙에 할당된다? [2]파일 다운로드1
12618정성태4/27/202121473사물인터넷: 58. NodeMCU v1 ESP8266 CP2102 Module을 이용한 WiFi UDP 통신 [1]파일 다운로드1
12617정성태4/26/202118338.NET Framework: 1050. C# - ETW EventListener의 Keywords별 EventId에 따른 필터링 방법파일 다운로드1
12616정성태4/26/202118005.NET Framework: 1049. C# - ETW EventListener를 상속받았을 때 초기화 순서파일 다운로드1
12615정성태4/26/202115324오류 유형: 712. Microsoft Live 로그인 - 계정을 선택하는(Pick an account) 화면에서 진행이 안 되는 문제
12614정성태4/24/202119943개발 환경 구성: 570. C# - Azure AD 인증을 지원하는 ASP.NET Core/5+ 웹 애플리케이션 예제 구성 [4]파일 다운로드1
12613정성태4/23/202118236.NET Framework: 1048. C# - ETW 이벤트의 Keywords에 속한 EventId 구하는 방법 (2) 관리 코드파일 다운로드1
12612정성태4/23/202117850.NET Framework: 1047. C# - ETW 이벤트의 Keywords에 속한 EventId 구하는 방법 (1) PInvoke파일 다운로드1
12611정성태4/22/202116131오류 유형: 711. 닷넷 EXE 실행 오류 - Mixed mode assembly is build against version 'v2.0.50727' of the runtime
12610정성태4/22/202116090.NET Framework: 1046. C# - 컴파일 시점에 참조할 수 없는 타입을 포함한 이벤트 핸들러를 Reflection을 이용해 구독하는 방법파일 다운로드1
12609정성태4/22/202119479.NET Framework: 1045. C# - 런타임 시점에 이벤트 핸들러를 만들어 Reflection을 이용해 구독하는 방법파일 다운로드1
12608정성태4/21/202120003.NET Framework: 1044. C# - Generic Host를 이용해 .NET 5로 리눅스 daemon 프로그램 만드는 방법 [9]파일 다운로드1
12607정성태4/21/202116451.NET Framework: 1043. C# - 실행 시점에 동적으로 Delegate 타입을 만드는 방법파일 다운로드1
12606정성태4/21/202123072.NET Framework: 1042. C# - enum 값을 int로 암시적(implicit) 형변환하는 방법? [2]파일 다운로드1
12605정성태4/18/202118476.NET Framework: 1041. C# - AssemblyID, ModuleID를 관리 코드에서 구하는 방법파일 다운로드1
12604정성태4/18/202116203VS.NET IDE: 163. 비주얼 스튜디오 속성 창의 "Build(빌드)" / "Configuration(구성)"에서의 "활성" 의미
12603정성태4/16/202117977VS.NET IDE: 162. 비주얼 스튜디오 - 상속받은 컨트롤이 디자인 창에서 지원되지 않는 문제
12602정성태4/16/202118839VS.NET IDE: 161. x64 DLL 프로젝트의 컨트롤이 Visual Studio의 Designer에서 보이지 않는 문제 [1]
12601정성태4/15/202117887.NET Framework: 1040. C# - REST API 대신 github 클라이언트 라이브러리를 통해 프로그래밍으로 접근
12600정성태4/15/202118315.NET Framework: 1039. C# - Kubeconfig의 token 설정 및 인증서 구성을 자동화하는 프로그램
12599정성태4/14/202118700.NET Framework: 1038. C# - 인증서 및 키 파일로부터 pfx/p12 파일을 생성하는 방법파일 다운로드1
12598정성태4/14/202119678.NET Framework: 1037. openssl의 PEM 개인키 파일을 .NET RSACryptoServiceProvider에서 사용하는 방법 (2)파일 다운로드1
12597정성태4/13/202118555개발 환경 구성: 569. csproj의 내용을 공통 설정할 수 있는 Directory.Build.targets / Directory.Build.props 파일
12596정성태4/12/202117837개발 환경 구성: 568. Windows의 80 포트 점유를 해제하는 방법
... 46  47  48  49  50  51  52  53  [54]  55  56  57  58  59  60  ...