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

비밀번호

댓글 작성자
 




... 31  32  33  34  35  [36]  37  38  39  40  41  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
13072정성태6/10/202216544Linux: 49. Linux - ls 명령어로 출력되는 디렉터리 색상 변경 방법
13071정성태6/9/202217247스크립트: 39. Python에서 cx_Oracle 환경 구성
13070정성태6/8/202217940오류 유형: 813. Windows 11에서 입력 포커스가 바뀌는 문제 [1]
13069정성태5/26/202219808.NET Framework: 2019. C# - .NET에서 제공하는 3가지 Timer 비교 [2]
13068정성태5/24/202218541.NET Framework: 2018. C# - 일정 크기를 할당하는 동안 GC를 (가능한) 멈추는 방법 [1]파일 다운로드1
13067정성태5/23/202216116Windows: 206. Outlook - 1년 이상 지난 메일이 기본적으로 안 보이는 문제
13066정성태5/23/202216197Windows: 205. Windows 11 - Windows + S(또는 Q)로 뜨는 작업 표시줄의 검색 바가 동작하지 않는 경우
13065정성태5/20/202217475.NET Framework: 2017. C# - Windows I/O Ring 소개 [2]파일 다운로드1
13064정성태5/18/202216916.NET Framework: 2016. C# - JIT 컴파일러의 인라인 메서드 처리 유무
13063정성태5/18/202217262.NET Framework: 2015. C# - 인라인 메서드(inline methods)
13062정성태5/17/202217838.NET Framework: 2014. C# - async/await 그리고 스레드 (4) 비동기 I/O 재현 [1]파일 다운로드1
13061정성태5/16/202216963.NET Framework: 2013. C# - FILE_FLAG_OVERLAPPED가 적용된 파일의 읽기/쓰기 시 Position 관리파일 다운로드1
13060정성태5/15/202220488.NET Framework: 2012. C# - async/await 그리고 스레드 (3) Task.Delay 재현파일 다운로드1
13059정성태5/14/202218314.NET Framework: 2011. C# - CLR ThreadPool의 I/O 스레드에 작업을 맡기는 방법 [1]파일 다운로드1
13058정성태5/13/202218402.NET Framework: 2010. C# - ThreadPool.SetMaxThreads 사용법 [1]
13057정성태5/12/202219855오류 유형: 812. 파이썬 - ImportError: cannot import name ...
13056정성태5/12/202215711.NET Framework: 2009. C# - async/await 그리고 스레드 (2) MyTask의 호출 흐름 [2]파일 다운로드1
13055정성태5/11/202220403.NET Framework: 2008. C# - async/await 그리고 스레드 (1) MyTask로 재현 [11]파일 다운로드1
13054정성태5/11/202217107.NET Framework: 2007. C# - 10진수 숫자를 담은 문자열을 숫자로 변환하는 방법 [11]파일 다운로드1
13053정성태5/10/202216493.NET Framework: 2006. C# - GC.KeepAlive 메서드의 역할
13052정성태5/9/202217024.NET Framework: 2005. C# - 생성한 참조 개체가 언제 GC의 정리 대상이 될까요?
13051정성태5/8/202216339.NET Framework: 2004. C# XingAPI - ACF 검색 결과로 구한 CSV 파일을 통해 퀀트 종목 찾기파일 다운로드1
13050정성태5/6/202216365.NET Framework: 2003. C# - COM 개체의 이벤트 핸들러에서 발생하는 예외에 대한 CLR의 특별 대우파일 다운로드1
13049정성태5/6/202213525오류 유형: 811. GoLand - Error: Cannot find package
13048정성태5/6/202216121오류 유형: 810. "ASUS TUF GAMING B550M-PLUS (WI-FI)" 모델에서 블루투스 장치가 인식이 안 되는 문제
13047정성태5/6/202215600오류 유형: 809. Speech Recognition could not start
... 31  32  33  34  35  [36]  37  38  39  40  41  42  43  44  45  ...