카테고리 없음

MSVC 의 빌드 플래그 관련

folcjin 2025. 6. 14. 12:00
728x90
반응형

MSVC에서는 프로그램을 컴파일할 때 어떤 종류의 CRT(C Runtime Library)를 사용할 것인지를 다음과 같은 플래그

주요 컴파일러 플래그 (CRT 종류 선택)
/MD 멀티스레드 + 동적 CRT 동적 (DLL) ucrtbase.dll, msvcp140.dll, 등
/MDd 디버그용 멀티스레드 + 동적 CRT 동적 (DLL) 위와 같지만 디버그 심볼 포함됨
/MT 멀티스레드 + 정적 CRT 정적 (라이브러리 내 포함) 없음 (모두 실행 파일에 포함됨)
/MTd 디버그용 멀티스레드 + 정적 CRT 정적 없음
어떤 플래그를 선택해야 할까?
- 라이브러리 배포가 필요 없는 독립 실행 파일이 필요 → /MT 또는 /MTd
- DLL을 통한 시스템 공유, 업데이트 지원을 원함 → /MD 또는 /MDd
- 디버그 빌드에서는 /MDd, /MTd, 릴리스 빌드에서는 /MD, /MT

주의: /MD와 /MT가 섞이면 링크 오류가 발생할 수 있으므로 프로젝트 전체에서 일관되게 사용해야 합니다.

 

ucrtbase.dll vs msvcrt.dll 차이점

Windows CRT에는 여러 버전이 있으며, 대표적으로 두 가지가 많이 사용
*. msvcrt.dll (Microsoft Visual C Runtime)
 - 초기 Windows용 CRT (Windows 95~XP)
 - 기본적인 C 함수 (printf, malloc 등) 제공
  - Windows 시스템에 내장되어 있었음
  - 문제점: 고정된 시스템 DLL이라 버전이 업데이트되지 않음 → 호환성 충돌 발생

*. ucrtbase.dll (Universal C Runtime)
  - Windows 10 이후 표준 CRT
  - Windows Update로 관리되는 범용 런타임
  - printf, malloc, fopen 등 주요 함수는 여기로 이전됨
  - MSVC 2015 이후 /MD 플래그를 사용하면 이 라이브러리가 참조됨

 

ucrtbase.dll 표준 C 함수 처리 (printf, malloc 등)
vcruntime140.dll C++ 런타임 초기화/예외 처리 (new, terminate, RTTI 등)
msvcp140.dll STL 등 C++ 표준 라이브러리 기능 지원
 

 

MSVC 버전CRT 구성관련 DLL
Visual Studio 2010 전통적인 msvcrt msvcrt100.dll 등
Visual Studio 2015~ UCRT + VCRuntime 분리 구조 ucrtbase.dll, vcruntime140.dll 등
/MD, /MT CRT를 동적(DLL) 또는 정적(내부 포함)으로 사용할지 설정함
msvcrt.dll Windows 내장된 오래된 CRT (더 이상 권장되지 않음)
ucrtbase.dll 최신 UCRT, MSVC 2015 이후 표준화된 CRT DLL
혼용 금지 /MT와 /MD 혼용 시 링크 오류 발생 가능

 

728x90
반응형
사업자 정보 표시펼치기/접기
사업자 등록번호 : -- | TEL : --