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

비밀번호

댓글 작성자
 




... 46  47  48  49  50  51  [52]  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12338정성태9/21/20209305오류 유형: 654. 우분투 설치 시 "CHS: Error 2001 reading sector ..." 오류 발생
12337정성태9/21/202010629오류 유형: 653. Windows - Time zone 설정을 바꿔도 반영이 안 되는 경우
12336정성태9/21/202013141.NET Framework: 942. C# - WOL(Wake On Lan) 구현
12335정성태9/21/202022511Linux: 31. 우분투 20.04 초기 설정 - 고정 IP 및 SSH 설치
12334정성태9/21/20207916오류 유형: 652. windbg - !py 확장 명령어 실행 시 "failed to find python interpreter"
12333정성태9/20/20208380.NET Framework: 941. C# - 전위/후위 증감 연산자에 대한 오버로딩 구현 (2)
12332정성태9/18/202010453.NET Framework: 940. C# - Windows Forms ListView와 DataGridView의 예제 코드파일 다운로드1
12331정성태9/18/20209590오류 유형: 651. repadmin /syncall - 0x80090322 The target principal name is incorrect.
12330정성태9/18/202010628.NET Framework: 939. C# - 전위/후위 증감 연산자에 대한 오버로딩 구현 [2]파일 다운로드1
12329정성태9/16/202012532오류 유형: 650. ASUS 메인보드 관련 소프트웨어 설치 후 ArmouryCrate.UserSessionHelper.exe 프로세스 무한 종료 현상
12328정성태9/16/202012763VS.NET IDE: 150. TFS의 이력에서 "Get This Version"과 같은 기능을 Git으로 처리한다면?
12327정성태9/12/202010344.NET Framework: 938. C# - ICS(Internet Connection Sharing) 제어파일 다운로드1
12326정성태9/12/20209830개발 환경 구성: 516. Azure VM의 Network Adapter를 실수로 비활성화한 경우
12325정성태9/12/20209349개발 환경 구성: 515. OpenVPN - 재부팅 후 ICS(Internet Connection Sharing) 기능이 동작 안하는 문제
12324정성태9/11/202010617개발 환경 구성: 514. smigdeploy.exe를 이용한 Windows Server 2016에서 2019로 마이그레이션 방법
12323정성태9/11/20209484오류 유형: 649. Copy Database Wizard - The job failed. Check the event log on the destination server for details.
12322정성태9/11/202010576개발 환경 구성: 513. Azure VM의 RDP 접속 위치 제한 [1]
12321정성태9/11/20208812오류 유형: 648. netsh http add urlacl - Error: 183 Cannot create a file when that file already exists.
12320정성태9/11/202010039개발 환경 구성: 512. RDP(원격 데스크톱) 접속 시 비밀 번호를 한 번 더 입력해야 하는 경우
12319정성태9/10/20209800오류 유형: 647. smigdeploy.exe를 Windows Server 2016에서 실행할 때 .NET Framework 미설치 오류 발생
12318정성태9/9/20209293오류 유형: 646. OpenVPN - "TAP-Windows Adapter V9" 어댑터의 "Network cable unplugged" 현상
12317정성태9/9/202011631개발 환경 구성: 511. Beats용 Kibana 기본 대시 보드 구성 방법
12316정성태9/8/202010040디버깅 기술: 170. WinDbg Preview 버전부터 닷넷 코어 3.0 이후의 메모리 덤프에 대해 sos.dll 자동 로드
12315정성태9/7/202012346개발 환경 구성: 510. Logstash - FileBeat을 이용한 IIS 로그 처리 [2]
12314정성태9/7/202010874오류 유형: 645. IIS HTTPERR - Timer_MinBytesPerSecond, Timer_ConnectionIdle 로그
12313정성태9/6/202012081개발 환경 구성: 509. Logstash - 사용자 정의 grok 패턴 추가를 이용한 IIS 로그 처리
... 46  47  48  49  50  51  [52]  53  54  55  56  57  58  59  60  ...