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

비밀번호

댓글 작성자
 




... 61  62  63  64  65  66  [67]  68  69  70  71  72  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
11972정성태7/3/201915282.NET Framework: 847. JAVA와 .NET 간의 AES 암호화 연동 [1]파일 다운로드1
11971정성태7/3/201912414개발 환경 구성: 447. Visual Studio Code에서 OpenCvSharp 개발 환경 구성
11970정성태7/2/201910739오류 유형: 552. 웹 브라우저에서 파일 다운로드 후 "Running security scan"이 끝나지 않는 문제
11969정성태7/2/201911147Math: 63. C# - 3층 구조의 신경망파일 다운로드1
11968정성태7/1/201917484오류 유형: 551. Visual Studio Code에서 Remote-SSH 연결 시 "Opening Remote..." 단계에서 진행되지 않는 문제 [1]
11967정성태7/1/201911686개발 환경 구성: 446. Synology NAS를 Windows 10에서 iSCSI로 연결하는 방법
11966정성태6/30/201911059Math: 62. 활성화 함수에 따른 뉴런의 출력을 그리드 맵으로 시각화파일 다운로드1
11965정성태6/30/201911916.NET Framework: 846. C# - 2차원 배열을 1차원 배열로 나열하는 확장 메서드파일 다운로드1
11964정성태6/30/201913384Linux: 20. C# - Linux에서의 Named Pipe를 이용한 통신
11963정성태6/29/201913123Linux: 19. C# - .NET Core Unix Domain Socket 사용 예제
11962정성태6/27/201910792Math: 61. C# - 로지스틱 회귀를 이용한 선형분리 불가능 문제의 분류파일 다운로드1
11961정성태6/27/201910333Graphics: 37. C# - PLplot - 출력 모음(Family File Output)
11960정성태6/27/201911144Graphics: 36. C# - PLplot의 16색 이상을 표현하는 방법과 subpage를 이용한 그리드 맵 표현
11959정성태6/27/201912275Graphics: 35. matplotlib와 PLplot의 한글 처리
11958정성태6/25/201916620Linux: 18. C# - .NET Core Console로 리눅스 daemon 프로그램 만드는 방법 [6]
11957정성태6/24/201915693Windows: 160. WMI 쿼리를 명령행에서 간단하게 수행하는 wmic.exe [2]
11956정성태6/24/201913740Linux: 17. CentOS 7에서 .NET Core Web App 실행 환경 구성 [1]
11955정성태6/20/201912062Math: 60. C# - 로지스틱 회귀를 이용한 분류파일 다운로드1
11954정성태6/20/201911454오류 유형: 550. scp - sudo: no tty present and no askpass program specified
11953정성태6/20/201910292오류 유형: 549. The library 'libhostpolicy.so' required to execute the application was not found in '...'
11952정성태6/20/201911057Linux: 16. 우분투, Centos의 Netbios 호스트 이름 풀이 방법
11951정성태6/20/201913888오류 유형: 548. scp 연결 시 "Permission denied" 오류 및 "WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!" 경고
11950정성태6/18/201912699.NET Framework: 845. C# - 윈도우 작업 관리자와 리소스 모니터의 메모리 값을 구하는 방법
11949정성태6/18/20199084오류 유형: 547. CoreCLR Profiler 예제 프로젝트 빌드 시 컴파일 오류 유형
11948정성태6/17/201911369Linux: 15. 리눅스 환경의 Visual Studio Code에서 TFS 서버 연동
11947정성태6/17/201912678Linux: 14. 리눅스 환경에서 TFS 서버 연동
... 61  62  63  64  65  66  [67]  68  69  70  71  72  73  74  75  ...