/MT와 /MD 차이
컴파일 옵션중에 /MT(multi-threaded), /MD(multi-threaded dll)라는게 있습니다 (설정위치: 프로젝트속성-C/C++-코드생성-런타임라이브러리). 특히나, 정적 라이브러리를 사용할 경우에는 이것 때문에 무척 골치가 아픕니다. XXX is already defined in YYY 어쩌구 하는 라이브러리 충돌 컴파일 에러들은 모두 이놈들 때문에 발생합니다. 사용한 라이브러리가 하나는 /MT로 생성되었고 하나는 /MD로 생성되었다면 짤없이 라이브러리 충돌 에러 메시지를 보게 됩니다. http://msdn.microsoft.com/ko-kr/library/2kzt1wy3(v=vs.90).aspx에 보면 /MT, /MD가 설명되어 있지만 핵심 내용은 컴파일시 정적 버전의 C 런타임 라이브러리를 사용할 것이냐(/MT) 아니면 동적 버전을 사용할 것이냐(/MD)의 차이입니다.
/MT: 응용 프로그램에서 다중 스레드 정적 버전의 런타임 라이브러리를 사용하도록 지정합니다. 즉 응용 프로그램에서 입출력, 메모리 할당과 같은 C 런타임 라이브러리(CRT, C Run-Time library) 기능을 사용할 때 정적 링크 버전인 LIBCMT.lib를 사용하여 프로그램이 빌드됨.
/MD: 응용 프로그램에서 다중 스레드 DLL 전용 버전의 런타임 라이브러리를 사용하도록 지정합니다. 즉 응용 프로그램에서 C 런타임 라이브러리 기능을 사용할 때 이것의 동적 링크 버전인 MSVCRT.lib를 사용하여 프로그램이 빌드됨.
만일 사용하는 외부 라이브러리는 /MT로 빌드되었는데, 현재 응용 프로그램은 /MD로 빌드하면 동일한 기능에 대해 서로 다른 두 버전의 라이브러리가 동시에 사용되기 때문에 XXX is already defined in YYY 어쩌구 하는 무수한 충돌 메시지를 보게 됩니다. 외부에서 가져온 라이브러리라면 /MD, /MT를 맞추거나 /NODEFAULTLIB:library 외에는 별 방법이 없지만(이렇게 해도 해결 안되는 경우가 많음), 자신이 직접 정적 라이브러리를 만들 경우에는 라이브러리든, 응용프로그램이든 모조건 다 /MT 옵션으로 맞추면 됩니다(debug용은 /MTd).