Windows 환경에서 Qt 5.7.0 빌드

Qt 4버전대만해도 4.8.6과같이 몇단계씩 꽤나 오랜기간동안 하위버전이 유지되었는데 요즘의 Qt 5는 몇달사이 5.6.1이였다가 뜬금없이 5.7.0으로 하위버전이 업데이트되었다. 대체로 5버전대는 한두번 업데이트 이후 하위버전이 올라가는거같다. 크롬과같이 빠른 변화와 버전업이 이루어지는 정책이 어느정도 Qt측에서도 이루어지고있는건가 싶기도하다.

이번 버전업에는 3D관련 업데이트가 주를 이루는거같으니 그다지 기능상에서의 변화는 없다고봐도 무방할거같다. 여담이지만 5.5버전에서는 frameless window 옵션이 추어진 창에서 HWND 형식의 핸들을 얻기위해 winId() 함수를 위젯에서 호출하게되면 그 이후로는 UI의 업데이트가 발생했을 때에도 화면이 업데이트 안되는 버그가 있었다. (5.6에서인가 버그가 해결되었다.)

직접 빌드하기 전 주의사항으로는 콘솔명령이 익숙하지 않거나 에디터 플러스나 울트라에디터를 사용하지 않는다면 빌드 안하고 홈페이지에서 이미 빌도된 바이너리를 받아서 설치하는게 더 낫다. 직접 빌드하는건 디버깅을 Qt Framework의 모듈 함수 내부까지 해야할 경우말고는 그냥 경험용으로 빌드 해보는것 밖에는 이유가 없다.

여담으로 5.6버전 이전엔 QSql의 ODBC 모듈에서 메모리 누수현상이 있었는데 당시 어디서 누수가 발생하는지 찾기위해 직접 빌드하여 며칠동안 헤맨덕에 원인을 찾고 패치를 재출하고 직접 수정하여 라이브러리를 사용한적이 있었다. 이런 상황이 아니라면 굳이 빌드해야 하는 이유는 없다.

참고로 WebView기능을 재공하는 WebEngine 모듈을 빌드하려면 8기가램 PC인 경우 빌드하길 추천한다. 자체적으로 병렬빌드를 수행하며 워낙 규모가 방대하여 컴파일할 때 파일들이 메모리에 캐싱되어야 느려지지않고, 링크를 할 때 메모리를 3기가 넘게 소모한다.

아래서부터는 과정 및 빌드 방법

 

다운로드
개인용도 LGPL 라이선스 동의하에 사용한다는 가정이다.

1. Qt 웹페이지인 www.qt-project.org/ 방문
2. 상단 메뉴에서 Download 페이지로 이동
3. 아래 순서로 선택
– In-house deployment 선택
– Open source distribution under an LGPL or GPL license 선택
– Yes / No / Not sure 중 아무거나 선택(배포할거냐는 질문)
– 앞에서 No를 선택 안했으면 No, it’s not a concern 선택(리버스 엔지니어링을 방지 유무) 그리고 Dynamically 선택(Static link를 사용한다면 GPL이 적용되며 배포시 GPL 라이선스로 배포해야한다.)
– 마지막으로 Yes (LGPL 또는 GPL 라이선스 동의 유무)
– Get started 클릭
4. View All Downloads 항목 클릭
5. Source packages & Other releases 항목에서 zip 파일 링크 옆 ‘(Info)’ 링크 클릭
6. http://ftp.jaist.ac.jp에서 재공되는 미러사이트 링크를 클릭하여 다운로드. 대체로 이곳 링크가 다운속도 빠르다.

 

빌드환경

(필수) Visual Studio 2015 Commumity Edition
몇년 전부터 Community Edition으로 무료로 개인사용자가 쓸 수 있도록 배포하고있다. 사용할 수 있는 기능은 Standard Edition과 동일한거같다. Visual Studio 구버전인 2012 이전버전에서는 하드웨어 그래픽가속을 사용하기위해서는 Windows SDK를 깔아야했지만 VS 2013, 2015는 그럴필요 없다. (근데 이게 Express Edition에서만 Windows SDK를 필요했는지 가물가물하다.) 어차피 Commumity Edition은 개인용도로 무료로 맘것 쓸 수 있고 어중간한 상용 메모리 프로파일러 보다 더 좋은 C언어 메모리 프로파일링을 지원하니 이걸 최신으로 설치하는게 걍 좋다.

(옵션) ICU
꼭 필요한건 아니다. ICU 라이브러리(DLL)가 대략 25메가정도(GUI 프로그래밍에 필요한 Qt Core와 Qt Gui, Qt Widgets 모듈의 용량을 합친것보다 용량이 크다.) 되기때문에 불필요하게 덩치가 커지기도하고 아직까진 이것이 없어서 문제가 된적이 없기때문에 생략한다. 참고로 Qt 5.3 버전부터는 이미 빌드 된 라이브러리 설치본으로 설치하면 ICU가 붙어다녔었는데 이번 5.7부터는 사라진걸보면 일반적으로 사용되어야 할 이유가 없는거같다. 이걸 사용해야한다면 configure 옵션에 몇가지 추가해야하지만 패스.

(옵션) Python 2.7
파이선이 설치되어있지않고 설치하지 않기를 원한다면 -skip declarative 옵션을 넣어서 configure를 실행하면 된다. 단, 파이선이 없으면 GLES, Quick, 3D, WebEngine(WebView)등의 모듈을 빌드할 수 없다. 필요하다면 python 홈페이지에서 2.7버전을 받아서 설치하면된다.

만약 파이선 3버전이 이미 설치되어있어도 WebEngine이 필요하다면 2.7을 깔아야한다.

(옵션) Jom
jom은 nmake를 대신하는 명령으로 nmake는 파일 하나씩 컴파일하지만 jom은 CPU의 쓰레드(논리 프로세서) 개수에 맞게 한번에 여러파일을 컴파일한다. 따라서 i7과같이 논리 프로세서가 8개라면 그만큼 빨라진다. (그렇다고 8배씩이나 빨라지는건 아니지만 소스파일이 많으면 매우 빨라진다.)

Jom – Qt Wiki 페이지에서 다운받을 수 있다. ‘the latest stable jom release’ 항목을 받으면 되지만 현재 git에서 직접 받는 방법 말고는 링크가 깨져있는 상태다. 현재 master 저장소는 빌드가 안되고 v1.1.0으로 tag된 branch는 Qt 5.7버전과 호환안되므로 패스.

하지만 Qt Creator에 jom 파일이 함께 포함되어있으므로 그걸 사용해도 된다. 아래 링크로 다운을 받고 qt 소스코드가 풀린 폴더에 같이 풀어넣고 nmake대신 jom을 치면 된다.

jom.zip

(중요) 지역설정
파이선 2.7버전이 깔려있고 -skip webengine 옵션을 사용하지않는다면 WebEngine 모듈을 빌드할 때 오류가난다. 이것 외에도 빌드될 때 자세히보면 CP949에서 표시할 수 없는 문자가있다는 경고가 많이 나타난다. WebEngine에서 빌드하는 chromium은 경고를 오류로 처리하도록 빌드되는데 WebEngine에서 오류가 나는것은 바로 이 경고때문이다. 이것을 해결하기위한 설정으로 다음과같이하면 된다.

1. 제어판 이동. 윈도 7, 8, 10 각각 제어판 이동이 다르다. 윈10이라면 시작 버튼을 우클릭하면 팝업 메뉴에서 제어판을 열 수 있고, 윈 8에서는 바탕화면의 ‘컴퓨터’를 열고 메뉴바에서 ‘컴퓨터’ 메뉴를 선택하면 ‘제어판’이 있다. 윈도 7은 그냥 ‘내 컴퓨터’를 열면 바로 제어판이 보인다.
2. ‘시계, 언어 및 국가별 옵션’ 선택 후 ‘국가 또는 지역’ 선택
3. 관리자 옵션 선택 후 ‘스시템 로캘 변경’ 버튼 클릭
4. 현재 시스템 로캘에서 ‘영어 (미국)’을 선택

Windows 다시 시작안내가 나오며 재부팅을 해줘야 적용이된다.

추가로 Visual Studio가 한글판이면 이후 에러메시지가 깨지게된다.

error on cp949

에러가 안나면 다행이지만 에러가 난다면 내용을 읽을 수 없다. (윈도 9x계열을 지원하는것도 아니면서 왜 아직도 유니코드 출력을 안하는지는 미지수.) 그래도 error code로 구글링하면 무슨 에러인지 알 수 있지만 Visual Studio IDE의 ‘도구’ – ‘옵션’에서 ‘환경’ – ‘국가별 설정’에 ‘추가 언어 가져오기’링크를 클릭하여 영어 언어팩을 받아 설치한 후 언어를 ‘English’로 선택하여 적용하면 컴파일러 메시지도 영어로 뜨게된다.

이번에도 WebEngine 모듈을 빌드할 때 문제가 발생한다. WebEngine이 사용하는 chromium은 덩치가 큰 소스를 빠르게 빌드하기위해 ninja를 사용한다. 이것을 빌드될 때 오류가난다. Visual Studio 2015에서는 ‘/FS’옵션이 추가되었고 이걸 기준으로 2015버전을 구분하는대 한글 상태에서는 구분을 못하는거로 보인다. ‘cl /nologo /?’명령으로 도움말을 보면 /FS 옵션의 설명이 한글과 영문과 위치가 다르며 포맷도 살작 다르다. 이것때문이라도 Qt를 빌드할 때 만이라도 영문으로 바꾸길 권장한다.

 

선행패치

WebEngine(WebView)를 사용하지 않는다면 패치할 필요가없다. 5.7.0버전에서는 아래와같은 에러가 발생하였고 각각 해결법은 다음과같다. 만약 바로 빌드를 시작할경우 적용이안되어 다시 빌드를 해야하는 경우도 발생한다. 에디터는 노트패드로는 편집 못하고 에디터 플러스나 울트라 에디터같은걸 써야한다.

내용: WebEngine을 빌드 시 error LNK2001: unresolved external symbol ff_w64_guid_data 발생
참고: https://bugs.chromium.org/p/chromium/issues/detail?id=264459#c25
패치방법: 소스코드 폴더에서 qtwebengine\src\3rdparty\chromium\third_party\ffmpeg 폴더로 이동
– ffmpeg_generated.gni 파일을 에디트 플러스나 울트라 에디터 등으로 열고 ‘vorbiscomment.c’를 검색하여 바로 다음줄에 “libavformat/w64.c”, 추가
– ffmpeg_generated.gypi 파일을 에디트 플러스나 울트라 에디터 등으로 열고 ‘vorbiscomment.c’를 검색하여 바로 다음줄에 ‘libavformat/w64.c’, 추가

(다음버전이나 다다음 배포 버전부터는 위 패치가 적용되어 배포될것이다.)

만약 빌드 전 해당 패치를 하지않고 진행하였을 경우 Qt 소스폴더 기준으로(또는 쉐도우 빌드를 시도했다면 쉐도우 빌드 폴더 기준으로) 아래 두 파일을 수정한다.

qtwebengine\src\core\debug\obj\src\3rdparty\chromium\third_party\ffmpeg\ffmpeg.ninja
qtwebengine\src\core\release\obj\src\3rdparty\chromium\third_party\ffmpeg\ffmpeg.ninja

수정 내용:

vorbiscomment를 검색하면 위 파일당 각각 3개 항목이 일치한다. 아래와 같이 수정하면 된다.

수정 전

build $
    obj\src\3rdparty\chromium\third_party\ffmpeg\libavformat\ffmpeg.vorbiscomment.obj: $
    cc $
    d$:\sdk\qt5.7.0.source\qtwebengine\src\3rdparty\chromium\third_party\ffmpeg\libavformat\vorbiscomment.c

수정 후

build $
    obj\src\3rdparty\chromium\third_party\ffmpeg\libavformat\ffmpeg.vorbiscomment.obj: $
    cc $
    d$:\sdk\qt5.7.0.source\qtwebengine\src\3rdparty\chromium\third_party\ffmpeg\libavformat\vorbiscomment.c
build $
    obj\src\3rdparty\chromium\third_party\ffmpeg\libavformat\ffmpeg.w64.obj: $
    cc $
    d$:\sdk\qt5.7.0.source\qtwebengine\src\3rdparty\chromium\third_party\ffmpeg\libavformat\w64.c

수정 전

    obj\src\3rdparty\chromium\third_party\ffmpeg\libavformat\ffmpeg.vorbiscomment.obj $

수정 후

    obj\src\3rdparty\chromium\third_party\ffmpeg\libavformat\ffmpeg.vorbiscomment.obj $
    obj\src\3rdparty\chromium\third_party\ffmpeg\libavformat\ffmpeg.w64.obj $

즉, w64.c 파일에 대한 컴파일 정보와 링크 목록을 추가하면 된다.

 

Qt 빌드

1. 도구 명령 프롬프트 실행
32비트 또는 64비트 도구 명령 프롬프트 중 필요한 버전으로 실행. 이후 Qt의 소스코드가 위치하는 폴더로 이동한다.

파이선 2.7이 있는경우 먼저 ‘python’을 실행 해 본다. (파이선을 깔지않으려하거나 Quick, 3D, WebEngine이 필요없다면 바로 ‘configure -skip declarative’ 명령을 수행한 후 nmake 명령으로 빌드를 시작해도 된다.)

위와같이 명령을 찾을 수 없다는 메시지가 나온다면 ‘set PATH=C:\Python27;%PATH%’ 명령을 실행한 후(기본 설치경로가 C:\Python27) python을 실행하여 구동되는것을 확인 후 진행해야한다. 파이선이 구동된다면 ‘컨트롤 + Z’키나 ‘quit()’를 실행하여 파이선 종료.

add gnuwin32 path

위와같이 ‘set PATH=소스파일경로\gnuwin32\bin;%PATH%’ 명령을 실행하여 gperf -v 명령을 내리면 버전 정보가 나타난다. (윈도 어느버전부터 되는지는 모르겠지만 set PATH=D:\SDK\qt 까지 입력했을 때 ‘Tab’키를 누르면 자동완성이 된다.)

이후 ‘configure’ 명령 실행. 오픈소스로 사용하기 위해 o 입력 – 라이선스 동의를 위해 y 입력. 약 1분정도 지나면 configure 명령이 완료된다.

2. (선택사항) WebEngine(WebView역활)같은 모듈을 사용하지 않는다면 ‘configure -skip webengine’과같이 실행하면 몇시간정도의 빌드시간을 줄일 수 있다. 또한 은근히 오래걸리는 examples는 ‘configure -nomake examples’과같이 입력하면 상당한 시간을 절약할 수 있다. (예전엔 demo browser가 있었지만 요즘은 사라진것같다. 덕분에 유용성이 크게 떨어졌다.) 이미 모듈을 잘 알고 필요없는것을 빼고싶다면 -skip 옵션을 더 지정하면 된다. (예: configure -skip webengine -skip declarative -skip connectivity)

3. (선택사항) Qt Framework를 실제로 사용할 때 필요없는 소스와 오브젝트 파일을 남기기 싫다면 ‘-prefix’ 옵션을 활용하면된다. 빌드 후 C:\OpenSource\Qt5.7.0 에 필요한 파일들을 복사하고싶다면 ‘configure -prefix C:\OpenSource\Qt5.7.0’ 으로 configure 명령을 실행하면된다. -prefix 옵션없이 빌드한다면 qmake와 dll 파일은 qtbase\bin에 위치하게되고 -prefix 옵션을 지정하면 지정된 경로의 bin 폴더에 qmake와 dll 파일이 위치한다.

4. 이제 nmake를 실행하면 빌드가 시작된다. 위에서 jom을 받아서 소스폴더에 함께 넣었다면 jom을 실행하면된다. PC의 성능에따라 다르지만 WebEngine의 빌드시간을 제외하면 보통 한두시간은 좋게걸린다.

5. (선택사항) ‘-prefix’ 옵션을 사용하여 ‘configure’명령을 실행했다면 ‘nmake install’ (또는 ‘jom install’)을 실행한다. prefix에 지정된 경로로 파일들이 복사되며 복사가 다 되었으면 소스파일 폴더는 지워도 된다.


빌드가 완료되면 64비트 컴파일러를 사용하여’configure -nomake examples -prefix D:\SDK\Qt5.7.0’옵션으로 실행했을경우 47.5기가의 공간을 차지하게된다. prefix로 설치경로를 지정했으며 install을 했다면 소스코드 폴더는 지워도된다.

source folder qt

아래는 install로 필요한 파일만 복사된 폴더 사용량

installed qt

이제 앞에서 영문으로 바꿔둔 윈도의 지역설정과 Visual Studio의 언어설정을 다시 한국어로 바꾸면 된다. 윈도의 지역설정은 영어로 두었을때 종종 한글이 깨지는 프로그램이 생긴다.

One Comment

    Qt 6.6.1 MSVC 2022로 빌드 – 날조 블로그

    […] 세가지 오류가 나타난다. 이 중 1, 2번은 이 글에서 “지역설정” 항목을 참조하여 변경하면 해결 된다. 3번 항목은 […]

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

*
*

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