C 런타임 라이브러리
런타임 라이브러리 링크 옵션인 /MD 및 /MT 컴파일 옵션을 이해하기 위해서는 런타임 라이브러리에 대한 이해가 필요하다.
런타임 라이브러리(Run-Time Libraries)란 여러 프로그램들이 실행 중에 입력과 출력, 메모리 관리, 연산, 예외 처리 등 공통적으로 필요로 하는 기능들을 별도의 라이브러리 형태로 묶어서 제공하는 것을 의미한다.
C/C++에서는 대표적으로 C 런타임 라이브러리(CRT; C Run-Time Libraries)가 있으며, 이는 ISO C99 표준 라이브러리를 통합하는 C++ 표준 라이브러리의 일부이다. 즉 C/C++로 작성된 프로그램이 실행 중에 기본적으로 필요로 하는 기능들을 포함하여 라이브러리 형태로 제공된 것을 의미한다.
/MD vs /MT 컴파일 옵션의 차이점
/MD 및 /MT 컴파일 옵션은 위에서 언급한 C 런타임 라이브러리(CRT)의 연결 방식과 관련된 옵션이다.
MD는 Multi-Threaded DLL, MT는 Multi-Threaded의 약자이며, 두 가지 옵션 모두 다중 스레드 개발을 지원한다는 의미이기도 하다.
참고로 /MDd, /MTd는 /MD 및 /MT의 디버그용 옵션이다.
과거에는 싱글 스레드만 지원하는 /ML, /MLd 옵션도 제공이 되었지만 최근의 멀티 코어, 멀티 스레드 환경에서는 경우에 따라 문제가 발생할 소지가 있어 제거된 것으로 보인다.
/MD 및 /MT 컴파일 옵션의 특징은 다음과 같이 정리할 수 있다.
/MD (Multi-Threaded DLL)
- /MD 옵션은 C 런타임 라이브러리를 별도의 DLL로 동적으로 연결(dynamic link)하는 방식
- MSVCRT.lib가 .obj 파일에 배치되어 빌드된다. (디버그 모드의 경우 MSVCRTD.lib)
- 여러 실행 파일이 라이브러리를 공유하여 사용할 수 있어 실행 파일 크기 및 메모리 사용량 감소
- 실행 파일 배포 시 반드시 재배포 패키지를 함께 배포해야 함
/MT (Multi-Threaded)
- /MT 옵션은 C 런타임 라이브러리를 실행 파일 내에 포함하여 정적으로 연결(static link)하는 방식이다.
- LIBCMT.lib가 .obj 파일에 배치되어 빌드된다. (디버그 모드의 경우 LIBCMTD.lib)
- 대상 시스템에 설치된 DLL에 의존하지 않는다.
- 실행 파일의 크기가 커진다.
런타임 라이브러리 링크 /MD, /MT 설정 방법
- [프로젝트 속성] -> [구성 속성] -> [C/C++] -> [코드 생성] : 런타임 라이브러리 선택
단일 실행 파일을 배포하는 경우라면 /MT 옵션으로 배포하는 것이 간편하겠지만,
다수개의 실행 파일을 배포하는 경우 /MD 옵션을 사용하면 배포 크기 및 메모리 사용량 측면에서 효율적일 수 있다.
만약 /MD 컴파일 옵션 사용 시 재배포 패키지를 함께 배포하지 않으면 다음과 같은 시스템 오류가 발생할 수 있다.
"VCRUNTIME140.dll이(가) 없어 코드 실행을 진행할 수 없습니다. 프로그램을 다시 설치하면 이 문제가 해결될 수 있습니다."
/MD 컴파일 옵션으로 배포 후 문제가 발생할 경우 아래 링크를 참고하여 재배포 패키지를 설치하면 되겠다.
'Programming > C, C++' 카테고리의 다른 글
[C/C++] std::string 포맷스트링(Formatted String) 구현 방법 (0) | 2021.01.16 |
---|---|
[C/C++] Debug 빌드 vs Release 빌드 차이점 정리 (0) | 2020.11.16 |