vc \ lib에는 4 가지 버전의 CRT 링크 라이브러리가 있습니다.
- libcmt.lib : 릴리스 빌드 (/ MT) 용 정적 CRT 링크 라이브러리
- libcmtd.lib : 디버그 빌드 (/ MTd)를위한 정적 CRT 링크 라이브러리
- msvcrt.lib : 릴리스 DLL 버전의 CRT (/ MD) 용 가져 오기 라이브러리
- msvcrtd.lib : 디버그 DLL 버전의 CRT (/ MDd) 용 가져 오기 라이브러리
링커 옵션, 프로젝트 + 속성, 링커, 명령 줄을보십시오. 이러한 라이브러리가 여기에 언급되지 않은 방법에 유의하십시오. 링커는 컴파일러에서 사용한 / M 스위치와 #pragma comment 지시문을 통해 어떤 .lib를 연결해야하는지 자동으로 파악합니다. 중요한 것은 / M 옵션과 링크 한 .lib가 일치하지 않으면 끔찍한 링크 오류가 발생하고 런타임 오류를 진단하기가 어렵다는 것입니다.
링커에 msvcrt.lib 및 libcmt.lib 에 연결하라는 메시지가 표시되면 인용 한 오류 메시지가 표시됩니다 . / MT로 컴파일 된 코드를 / MD와 연결된 코드와 연결하면 이런 일이 발생합니다. CRT 버전은 하나만있을 수 있습니다.
/ NODEFAULTLIB는 링커에게 / MT 컴파일 된 코드에서 생성 된 #pragma comment 지시문을 무시하도록 지시합니다. 다른 링커 오류가 드물지 않지만 이것은 효과적 일 수 있습니다. 정적 CRT 버전에서는 extern int이지만 DLL 버전에서는 함수로 매크로 된 errno 와 같은 것들 . 많은 사람들이 그렇게 좋아합니다.
글쎄,이 문제를 올바른 방법으로 수정하고 잘못된 / M 옵션으로 컴파일 된 링크하고있는 .obj 또는 .lib 파일을 찾으십시오. 실마리가 없다면 "/ MT"에 대한 .obj / .lib 파일을 grepping하여 찾을 수 있습니다.
Btw : version.dll과 같은 Windows 실행 파일에는 작업을 수행하기위한 자체 CRT 버전이 있습니다. c : \ windows \ system32에 있으며 자신의 프로그램에 안정적으로 사용할 수 없으며 CRT 헤더를 사용할 수 없습니다. 프로그램이 사용하는 CRT DLL의 이름이 다릅니다 (예 : msvcrt90.dll).