Visual Studio 2015의 Clang 컴파일러 지원

이 글은 단순한 사용기 겸 삽질기이다.


Visual Studio 2015 SP1에서부터 Clang/C2라는 명칭으로 Clang/LLVM 컴파일러를 지원/재공한다. 이상하게도 이 도구가 설치관리자에서 보면 ‘플랫폼 간 모바일 개발’ – ‘Visual C++ 모바일 개발’항목에 있다는것인데… Clang/LLVM이 모바일용 컴파일러도아니고 왜 모바일이라는 단어가 붙어있는지 모르겠다.

vs2015
PS) 만약 Visual Studio 2015를 쓰고있지않거나 서비스팩이 적용되지않은 버전, 아니면 추가로 설치한다면 https://www.visualstudio.com/ko-kr/products/visual-studio-community-vs.aspx 이곳에서 설치관리자 받아서 설치/업데이트 가능

신기한점은 Visual C컴파일러와 목적파일이 호환된다는것. 이것은 LLVM을 직접 받아서 clang을 사용해도 마찬가지였다.  LLVM의 clang-cl에서 /MD 옵션을 주고 빌드하면 msvcrt120.dll과 같은 dll이 링크되어있다(흠좀 무섭다). 문제는 여기까지는 좋은데… 딱히 활용 방안이 없다. 분명 Clang/LLVM이 타 컴파일러에비하면 컴파일 속도가 상당한 수준으로 빠르다는것인데 왠만한 덩치가 큰 소스가 아니면 직접적으로 컴파일 속도에 대한 이점을 느끼기 힘들다는 점이다.

Qt 5.6 기준으로 리눅스/맥에서는 Clang 컴파일러를 지원하지만(애초 맥은 Xcode에서 재공하는 컴파일러가 LLVM이니…) 윈도우에서는 공식지원을 하지않는다. 직접 해본결과 처음 qmake가 빌드되기까지는 warning이 수없이 많이뜨지만 헤더 하나, 한줄만 수정하면 에러가 없이 빌드가 된다. 경고 메시지에 의한 오버헤드 때문인지 MSVC 환경에서는 약 33초만에 qmake가 빌드되고 Qt의 빌드준비가 끝나는반면, Clang을 사용하면 1분 33초나 걸린다. nmake 명령으로 Qt의 라이브러리를 빌드하려하면 잘 되는것처럼 보이지만 결국 미리 컴파일 된 헤더옵션에서 에러가 나버린다. pch옵션을 끄고 다시 시도해볼까 했지만 역시나 의미를 찾지못하여 더이상 삽질은 안했다.

Chromium같은경우 버그리포트를 보면 윈도상에서의 Clang 경고나 에러에대한 패치가 소스트리에 커밋되었다. 윈도 환경에서의 Clang 컴파일러를 사용한 빌드를 지원하는거같은데… 웹킷이란것 하나 빌드하는데 몇시간 단위로 소모되기때문에 엄두가 나질않는다. 어차피 크롬을 쓰면되니까 크로니움을 직접 빌드해 봐야 그닥 이점이 없다(…) 그저 아래 비교표에서 Clang이 월등히 빠른것과같이 아마 MSVC환경에서의 빌드보다 빠르지않을까 추측만 할 뿐.

llvm performance
윈문페이지: http://www.yosoygames.com.ar/wp/2013/12/microsoft-we-need-to-talk-about-visual-studio/


그냥 떠들다보니 이상한 방향으로 나아가버렸는데(…) MSVC에서 Clang을 쓰기위해서는 먼저 첫번째 이미지와같이 Clang with Microsoft CodeGen 항목을 깔아야하고, 플랫폼 도구 집합에서 Clang with Microsoft CodeGen을 선택하면 된다.

clang ms godegen
추가적으로 LLVM에서 직접 Clang을 받아서 설치했다면 다음과같이 LLVM이 도구 집합에 함께 나타난다. 문제라면 LLVM은 MSVC와는 컴파일러 옵션이 다르기때문에 선택해서 빌드 해 봤자 프로젝트에서 설정 된 내용들이 무용지물이다. (Clang/LLVM에서 별도로 재공하는 clang-cl은 Clang/C2처럼 MSVC와 거의 동일하게 옵션을 재공한다.)

llvm from visual studio
만약 아래화면과 같은 윈도의 지역설정이 한국어가 아닌경우 한국어 버전의 비쥬얼 스튜디오가 깔려있다면 소스파일이 유니코드 형식으로 저장되는데… 왜 혼자서 UTF-8이 아닌 UTF-16으로 저장되는지 모르겠다. Clang에서는 UTF-16을 지원 안하기때문에 각각 파일을 열어서(또는 컴파일 안되는 파일 하나하나) ‘파일’ – ‘고급 저장 옵션’에서 인코딩 항목을 ‘유니코드(서명 있는 UTF-8) – 코드 페이지 65001’로 선택하여 확인, 저장해야한다.

windows region
Clang이 MinGW32나 Cygwin과는 다르게 MSVC와 동일한 바이너리 파일을 생성한다는 것이 흥미로운데, 만약 Qt에서 Clang for Windows 버전을 지원하게되면 다시한번 빌드를 시도 해 봐야겠다.

암튼 두서없는 글 끝!

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다

*
*

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.