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

비밀번호

댓글 작성자
 




... 166  167  168  169  170  171  172  173  174  175  176  177  [178]  179  180  ...
NoWriterDateCnt.TitleFile(s)
585정성태6/4/200834310.NET Framework: 101. WPF - ActiveX 컨트롤 호스팅하는 방법 [2]
582정성태5/16/200826117오류 유형: 55. Windowless ActiveX controls are not supported
580정성태4/24/200825236VC++: 34. 64비트 윈도우즈에서의 이벤트 후킹
579정성태4/24/200825012VC++: 33. 변환 후의 RGS 파일 내용을 얻는 방법
577정성태4/16/200825988.NET Framework: 100. XML Serializer를 이용한 값 복사 [5]
575정성태4/7/200823189오류 유형: 54. TFS Source Control - 명령을 사용할 수 없음 [2]
574정성태3/31/200821345오류 유형: 53. TFS 연결 오류 - The workspace [...] exists on computer [...]
573정성태3/25/200825342Windows: 31. TS Web Access와 UAC [1]
570정성태3/17/200824469오류 유형: 52. TFS 연결 오류 - TF31001 [2]
569정성태3/16/200825570Team Foundation Server: 24. TFS 2008로 마이그레이션 (2) [2]
566정성태2/28/200826699.NET Framework: 99. AppDomain.GetEntryAssembly()를 우회하는 방법파일 다운로드1
564정성태2/16/200826387Windows: 30. TS Web Access + Vista SP1 [2]
563정성태2/16/200825740오류 유형: 51. Vista(UAC) + 웹 프로젝트 디버깅: System.UnauthorizedAccessException
562정성태2/12/200830002Windows: 29. Windows Server 2008 설치 [4]
561정성태1/10/200823667오류 유형: 50. IE 7 + 잘못된 HTC 파일 경로 = File not found [5]
559정성태1/1/200828480Windows: 28. Vista에서 끌어다 놓기로 GAC 등록하는 방법 [2]
558정성태1/1/200845597개발 환경 구성: 33. 32bit/64bit OLE DB Provider [1]
557정성태12/22/200723928개발 환경 구성: 32. WSCF와 VS.NET 2008
556정성태12/16/200722099기타: 22. 인기 순위 정리 : 조회수 1000 회 이상
555정성태12/16/200725035기타: 21. 인기 순위 정리 : 조회수 500 ~ 999회 글 목록
554정성태12/16/200729529기타: 20. 인기 순위 정리 : 조회수 250 ~ 499회 글 목록
553정성태12/16/200729932기타: 19. 인기 순위 정리 : 조회수 100 ~ 249회 글 목록
552정성태12/16/200723507기타: 18. 인기 순위 정리 : 조회수 000 ~ 099 회 글 목록
550정성태12/16/200722606Team Foundation Server: 23. TFS 2005에서 TFS 2008로 마이그레이션 [2]
549정성태12/16/200723975Team Foundation Server: 22. TFS 설정 - 주소를 도메인으로 변경
548정성태12/15/200741511오류 유형: 49. Report Server - 원격 서버에 연결할 수 없습니다
... 166  167  168  169  170  171  172  173  174  175  176  177  [178]  179  180  ...