관리 메뉴

비전늅

(C++/CLI) CLR에서 std::thread, std::mutex 를 지원하지 않는 문제 본문

Computer Languages/C# || C++ || CLR

(C++/CLI) CLR에서 std::thread, std::mutex 를 지원하지 않는 문제

visionNoob 2018. 2. 21. 15:13

Environment : Visual Studio 2015, .NET Framework 4.7


0.Preface

C++ 로 작성한 library(lib, dll)을 .net 프레임워크 기반의 C# 코드로 가져오는 방법 중 하나는  C++ library를   C++/CLI 형태의 wrapper class를 만들어서 사용하는 방법입니다[1]. 


하지만 이 방법을 사용하여 CLR 프로젝트를 빌드할 때  가끔 에러가 발생하곤 합니다. 


#error is not supported when compiling with /clr or /clr:pure.


저의 경우 C++ native code로 작성된 코드에 std::thread, std::mutex 가 포함된 경우 아래와 같은 컴파일 에러를 경험하였습니다. 


#error <thread> is not supported when compiling with /clr or /clr:pure.

#error <mutex> is not supported when compiling with /clr or /clr:pure.

1.Solution

그래서 찾은 해결 법은 이곳[2] 에서 찾았습니다.


블로그 제목은 

<Use C++ Forward Declaration to Fix Std Types Not Supported with CLR Issue.>


에러 이유 :  C++/CLI 에서 C++의 Concurrency 를 제대로 지원해 주지 않기 때문[3]
하여간, 
"native C++ class의 header에 std::thread, std::mutex, atomic 관련된 변수들이 포함되면" 위와 같은 에러가 뜹니다. 

결국 header가 위와 같은 변수를 포함하지 않는다면 해결되는 문제입니다. 
때문에 아래와 같은 경우에는 에러가 나지 않습니다. 

Case 1 : myClass.cpp(not header)에 선언된 "myClass 의 맴버함수" 내에 지역변수로 선언된 std::thread t1 을 사용하는 경우
Case 2 : myClass.cpp 에 선언된 전역변수 std::thread t1 을 사용하는 경우 

하지만 나는 굳이 header에 class variable로 std::thread를 넣고싶다!!!!! 하는 경우는 
->클래스 자체를 Forward Declaration으로 선언하면 됩니다.  이에 대한 내용이 [2]에 있습니다. 


2.Conclusion

개인적으로 이런 에러가 일어나는 이유를 더 많이 고민해봐야 할 필요가 있을 것 같습니다. 


References 

[1] http://six605.tistory.com/384

[2] http://a-ling.net/blog/computer/use-c-forward-declaration-to-fix-std-types-not-supported-with-clr-issue/

[3] https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3814789-support-c-11-concurrency-header-files-in-c-cli

Comments