Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 1개 있습니다.)
(시리즈 글이 4개 있습니다.)
VC++: 108. DLL에 정의된 C++ template 클래스의 복사 생성자 문제
; https://www.sysnet.pe.kr/2/0/11153

VC++: 109. DLL에서 STL 객체를 인자/반환값으로 갖는 함수를 제공할 때, 그 함수를 외부에서 사용하는 경우 비정상 종료한다면?
; https://www.sysnet.pe.kr/2/0/11154

VC++: 115. Visual Studio에서 C++ DLL을 대상으로 단위 테스트할 때 비정상 종료한다면?
; https://www.sysnet.pe.kr/2/0/11173

오류 유형: 683. Visual C++ - error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug'
; https://www.sysnet.pe.kr/2/0/12418




Visual C++ - error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug'

특정 상황에서 저 오류가 발생하는 듯한데, 재현을 못하겠군요. ^^; 어쨌든 저런 오류가 발생하면 정적 라이브러리(예: StaticLib1.lib)는 MT_StaticRelease (/MT)로 빌드된 것이고, 그것을 사용하는 프로젝트 측에서는 MDd_DynamicDebug (/MTd)로 빌드하고 있다는 의미입니다. 왜 런타임 라이브러리를 맞춰야 하는지는 지난 글에서 설명한 적이 있습니다.

DLL에 정의된 C++ template 클래스의 복사 생성자 문제
; https://www.sysnet.pe.kr/2/0/11153

그래도, 재현 시도를 다음과 같이 해봤는데,

StaticLib1 프로젝트
    - 정적 lib 유형
    - Release + Multi-threaded (/MT)

ConsoleApplication1 프로젝트
    - StaticLib1를 정적으로 참조 추가
    - Debug + Multi-threaded DLL (/MD)

정황상으로,

Linker Tools Error LNK2038
; https://learn.microsoft.com/en-us/cpp/error-messages/tool-errors/linker-tools-error-lnk2038

/MD, /MT, /LD (Use Run-Time Library)
; https://learn.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-time-library

LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease' in file.obj
; https://stackoverflow.com/questions/28887001/lnk2038-mismatch-detected-for-runtimelibrary-value-mt-staticrelease-doesn

빌드할 때 다음과 같은 식의 오류가 발생해야 하는데,

1>StaticLib1.lib(ConsoleApplication1.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MDd_DynamicDebug' in ConsoleApplication1.obj

조용하군요. ^^; (첨부 파일은 이 글의 예제 프로젝트입니다.) 혹시 재현 가능한 방법을 아시는 분은 덧글 부탁드립니다. ^^




그건 그렇고 저런 오류가 발생했을 때, 사용하는 측에서도 /MT로 빌드하면 오류가 없어져야 합니다. 그런데 실제로 해보면 디버그 빌드에서는 MTd_StaticDebug로 고정 적용돼 오류가 다음과 같은 식으로 바뀝니다.

Error LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MTd_StaticDebug' in ConsoleApplication1.obj

물론 그 상태에서 릴리스 빌드로 하면 /MT가 적용돼 오류가 사라집니다. (그렇다고 개발을 릴리스 빌드로 할 수는 없잖아요!!!)

직접적인 원인은 알 수 없지만, 디버그 빌드에서도 /MT가 유효하게 먹힐 수 있는 방법이 있습니다. 바로 Preprocessor에 정의된 _DEBUG 상수를 빼는 것입니다. (릴리스 빌드는 그 상수 없이 빌드가 되니 /MT 적용이 잘 되었을 것입니다.)

문서를 보면,

/MD, /MT, /LD (Use Run-Time Library)
; https://learn.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-time-library

/MTd - Defines _DEBUG and _MT...[생략]...

/MTd 옵션이 _DEBUG 상수 정의에 기여하는 것 같은데, 테스트 결과는 오히려 그 반대로 _DEBUG 상수가 /MTd 적용 여부를 결정하고 있습니다.




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

[연관 글]






[최초 등록일: ]
[최종 수정일: 5/11/2023]

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

비밀번호

댓글 작성자
 




... 181  182  183  184  185  186  187  188  189  190  [191]  192  193  194  195  ...
NoWriterDateCnt.TitleFile(s)
208정성태10/21/200617487Windows: 1. 성태도 ^^ Vista 설치 해봤습니다.
212정성태10/20/200617140    답변글 Windows: 1.1. Vista 에서 WinFX 런타임 구동
207정성태4/13/200626169VC++: 23. VC++ RGS 파일에 사용자 정의 파라미터 추가
205정성태4/13/200623298VS.NET IDE: 37. devenv.exe를 이용한 Command Line 컴파일 [1]
204정성태5/8/200618405웹: 2. Server Unavailable - Server Application Unavailable
203정성태4/13/200617258웹: 1. IIS 설정 옵션: Verify(Check) that file exists
202정성태4/13/200616949VS.NET IDE: 36. Automatically synchronize with an Internet time server
201정성태4/13/200620138기타: 12. XMLHTTP Failure and SUS Admin
200정성태4/13/200619372.NET Framework: 58. 웹 서비스 메서드 호출 오류 유형 - text/html; charset=xxx, but expected 'text/xml'
199정성태4/13/200620755스크립트: 6. XHTML or HTML 4.01 표준 준수
194정성태4/13/200619970VC++: 22. IDL Library 절
193정성태4/13/200620396.NET Framework: 57. IComponentChangeService 인터페이스
192정성태6/1/200617691VC++: 21. Visual C++ struct와 class의 차이점
189정성태4/13/200625345VC++: 20. ActiveX CAB 파일 오류 유형 - 파일을 대상 디렉터리로 복사할 수 없음. [6]
187정성태11/24/200519860VS.NET IDE: 35. VS.NET 2005 IDE Tip - 2번째 : XML / XSL 지원 강화
186정성태11/23/200517175.NET Framework: 56. VS.NET 2005 IDE Tip
182정성태11/21/200517299.NET Framework: 55. 에러가 발생할 것만 같은 코드
181정성태11/20/200546218.NET Framework: 54. 한글이 포함된 ANSI, UTF-8, UNICODE 텍스트 파일 읽기 [3]파일 다운로드1
197정성태12/25/200521608    답변글 .NET Framework: 54.4. [관련 문제] A 태그의 href에서의 문제.
198정성태12/27/200519291    답변글 .NET Framework: 54.5. [추가]: VS.NET으로 UTF-8 홈페이지 구성하기
179정성태11/8/200516981.NET Framework: 53. .NET Remoting: 메시지 교체
178정성태11/5/200517753기타: 11. Dual Core 장만. ^^
177정성태11/2/200517577COM 개체 관련: 17. CoGetClassObjectFromURL파일 다운로드1
176정성태3/29/200622851.NET Framework: 52. covariance? [1]파일 다운로드1
175정성태10/31/200518336.NET Framework: 51. MSXML 6.0에서 디지털 서명 기능을 제거!
180정성태11/15/200518632    답변글 VS.NET IDE: 51.1. MSXML 6.0 정식 릴리스
... 181  182  183  184  185  186  187  188  189  190  [191]  192  193  194  195  ...