비전늅
(C++/CLI) CLR에서 std::thread, std::mutex 를 지원하지 않는 문제 본문
Computer Languages/C# || C++ || CLR
(C++/CLI) CLR에서 std::thread, std::mutex 를 지원하지 않는 문제
visionNoob 2018. 2. 21. 15:13Environment : 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
Comments