일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 파리
- 여행
- Qt
- 스타벅스
- Windows
- 포르쉐 박물관
- 아메리카노
- 독일
- 루브르 박물관
- 베론빵
- C++
- 리버 크루즈
- 암스테르담 국립 미술관
- 아이스 아메리카노
- 플로우메터
- 도톤보리
- 유럽
- 하파란다
- 초코 바나나 코코아
- 다하우 수용소
- 하이네켄 맥주 박물관
- 매스커피
- 오사카
- 국립 독일 박물관
- 올륌픽 파르크
- 뮌헨
- 간사이 공항
- this call
- 룰레아
- 나르비크
- Today
- Total
구름
Qt 정적 라이브러리 빌드 본문
본 게시글은 http://wohlsoft.ru/pgewiki/Building_static_Qt_5 의 글을 번역및 첨삭한 글임을 알리며
GNU Free Documentation License 를 따릅 니다.
2017.07.09
Qt 5.9.1 버전 기준, 몇몇 수정사항을 추가했습니다.
2018.03.23
Qt 5.10.1 버전 기준, 몇몇 수정사항을 추가 했습니다.
Qt 로 만든 프로그램은 프레임워크 라이브러리를 동적 링크로 사용 합니다. 정적빌드를 하게 되면 *.DLL 이나 *.SO, *DIYLIB 와 같은 동적 라이브러리 없이 모든 코드가 실행파일 안에 들어가게 만들 수 있습니다. 따라서 정적 빌드한 Qt 프로그램은 Qt 라이브러리가 없는 어떤 컴퓨터에서도 바로 실행 할 수 있습니다.
정적 빌드한 버전의 Qt 응용프로그램은 오픈소스로 공개할 의무가 생깁니다! (GPLv3 licenes).
혹은 상용 라이센스를 구입하여야 합니다.
MaintenanceTool
기존 Qt 이용자 라면 Add or remove components 를 클릭하여 컴포넌트 관리로 들어가도록 합니다.
Beta 버전도 있던데, 저는 최신 릴리즈인 Qt 5.10.1 버전을 설치하도록 하겠습니다.
위 체크박스 중 필요한 항목들(Sources 를 체크해야 해당 버전의 소스코드가 인스톨 됩니다.) 만 체크후 Next 를 눌러 줍니다.
(저는 Microsoft VisualStudio 에서도 작업할수 있도록, 유니버셜 윈도우 프로그램 제작을 위해서 MSVC, UWP 를 체크해 놓았습니다.)
Windows
빌드 및 설치
압축 해제 한 디렉토리C:\Qt\5.10.1\Src\qtbase\mkspecs\win32-g++
로 이동하여 qmake.conf 파일을 엽니다. (notepad 등)
아래 두 줄을 추가 합니다.
QMAKE_CFLAGS_RELEASE += -Os -momit-leaf-frame-pointer
QMAKE_LFLAGS = -static -static-libgcc
로 수정후 저장해 줍니다.
Qt 프롬프트로 콘솔창을 켜서 configure 가 있는 qtbase 디렉토리로 이동합니다.
[cd ../Src/qtbase]
configure -static -platform win32-g++ -prefix "C:\Qt\Qt5_static" -debug-and-release -opensource -confirm-license -nomake examples -nomake tests -nomake tools -opengl desktop -no-angle
입력하여 configure 을 시작합니다. (몇분정도 걸릴수 있습니다.)
"C:\Qt\Qt5_static" 은 static library 를 설치할 위치 입니다. 본인이 편한 곳으로 경로를 설정하면 됩니다.
작업 완료 후
mingw32-make -k -j4
을 입력하여 빌드를 시작합니다. (CPU 성능에 따라 1시간 혹은 그이상의 시간이 걸릴수 있습니다. ssd 를 쓰면 확실히 빌드 속도가 빠릅니다. 빌드 해야 할 소스가 많다보니 I/O 시간이 꽤 중요하게 적용되는것 같습니다.)
-k 는 작업대상이 만들어 지지 않아도 계속 빌드를 하라는 옵션이고, -j는 worker 의 개수를 설정합니다. cpu 코어 개수로 넣어주면 노는 cpu 없이 빌드하게 됩니다.
mingw32-make -k install
을 입력하여 설치해주시면 모든 작업이 마무리 됩니다.
원본 문서에는 배치파일을 이용하여 자동으로 작업하는 방법으로 안내하고 있습니다.
빌드 스크립트 작성
- QtSrcDir : 소스코드를 압축해제 한 절대경로 입니다. (configuration.bat 파일 이 있어야 합니다.)
- QtStaticDir : 정적빌드된 Qt 가 설치될 곳 입니다. (bin, lib, include, plugins 등의 디렉토리가 포함됩니다.)
- MingwDir : MinGw 컴파일러의 절대경로 입니다. (bin, lib, include 디렉토리가 포함되어 있습니다.)
@echo offrem ====================CONFIGURE BEFORE RUN SCRIPT!!======================set QtSrcDir=%CD%\qt-everywhere-opensource-src-5.7.0set QtStaticDir=C:\Qt\5.7_Staticset MingwDir=C:\Qt\Tools\mingw530_32set LANG = enrem =======================================================================PATH = %MingwDir%\bin;%MingwDir%\opt\bin;%SystemRoot%\system32;%SystemRoot%set FILE_TO_PATCH=%QtSrcDir%\qtbase\mkspecs\win32-g++\qmake.confecho %FILE_TO_PATCH%if exist %FILE_TO_PATCH%.patched goto skipPatchtype %FILE_TO_PATCH%>%FILE_TO_PATCH%.patchedecho.>>%FILE_TO_PATCH%echo QMAKE_LFLAGS += -static -static-libgcc>>%FILE_TO_PATCH%echo QMAKE_CFLAGS_RELEASE -= -O2>>%FILE_TO_PATCH%echo QMAKE_CFLAGS_RELEASE += -Os -momit-leaf-frame-pointer>>%FILE_TO_PATCH%echo DEFINES += QT_STATIC_BUILD>>%FILE_TO_PATCH%:skipPatchset QT_INSTALL_PREFIX = %QtStaticDir%set OldDir=%CD%cd %QtSrcDir%cmd /C "configure.bat -static -release -platform win32-g++ -prefix %QtStaticDir% -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-freetype -opengl desktop -qt-sql-sqlite -no-openssl -opensource -confirm-license -make libs -nomake tools -nomake examples -nomake tests"if ERRORLEVEL 1 goto :errormingw32-make -r -k -j4if ERRORLEVEL 1 goto :errormingw32-make -k installif ERRORLEVEL 1 goto :errorset FILE_TO_PATCH=%QtStaticDir%\mkspecs\win32-g++\qmake.confecho.>>%FILE_TO_PATCH%echo CONFIG += static>>%FILE_TO_PATCH%echo ============BUILT!============goto exitX:errorecho ============ERROR!============:exitXpausecd %OldDir%
빌드 후 설치
"build_static_qt.bat" 을 실행하고 1~3시간 가량 모든 작업이 끝날때 까지 기다립니다. (cpu 성능에따라 차이가 날 수 있습니다.)
Linux/macOS
의존성 항목 다운
sudo apt-get install gcc g++ make wgetsudo apt-get install build-essentialsudo apt-get install "^libxcb.*" libx11-dev libx11-xcb-dev libxcursor-dev libxrender-dev libxrandr-dev \libxext-dev libxi-dev libxss-dev libxt-dev libxv-dev libxxf86vm-dev libxinerama-dev libxkbcommon-dev \libfontconfig1-dev libasound2-dev libpulse-dev libdbus-1-dev libts-dev udev mtdev-tools webp \libudev-dev libglm-dev libwayland-dev libegl1-mesa-dev mesa-common-dev libgl1-mesa-dev \libglu1-mesa-dev libgles2-mesa libgles2-mesa-dev libmirclient-dev libproxy-dev libgtk2.0-dev
brew install coreutils
brew install binutils
brew install gnu-sed
port install bunutils
port install coreutils
port install gsed
Configure
./configure -static
입력 후 상용버전일 경우 c, 오픈소스 버전일 경우 o 를 눌러 줍니다.
오픈소스 버전의 경우, 라이센스에 동의 하면 yes 를 입력해 configure 을 시작합니다. (몇분정도 걸릴수 있습니다.)
원본문서에는 여러 옵션을 붙여 configure 을 합니다.
Linux Mint / Debian
./configure -static -release -nomake examples -nomake tools -prefix ~/Qt/5.7.0_static -system-xcb \
-qt-libpng -no-libjpeg -qt-zlib -qt-pcre -gtk -opensource -confirm-license -opengl \
-qt-freetype -pulseaudio -alsa
macOS
./configure -static -release -nomake examples -nomake tools -prefix ~/Qt/5.7.0_static_osx \
-qt-libpng -no-libjpeg -qt-zlib -qt-pcre -gtkstyle -opensource -confirm-license -gtkstyle -opengl -qt-freetype -no-ssse3
빌드 및 설치
make
1~3시간 가량 모든 작업이 끝날때 까지 기다립니다. (cpu 성능에따라 차이가 날 수 있습니다.)
make -r -j 4
-r -j x 인자로 빌드속도를 빠르게 할 수 있습니다. (x : 동시에 작업 하는 수)
make install
마지막으로 설치 디렉토리에 복사해줍니다.
공통
정저라이브러리가 빌드된 디렉토리 로 가서 qmake 파일을 선택합니다.
[/5.7/Src/qtbase/bin/qmake]
이제 프로젝트 생성 시 정적 빌드를 위한 도구가 생겼습니다. 기존 프로젝트 역시 Qt Creator -> Project -> Add Kit 에서 정적 빌드 도구를 추가 할 수 있습니다.
동적 링크로 만든 실행파일은 필요한 라이브러리 파일이 없으면 실행되지 않지만 정적링크로 필요한 라이브러리를 실행파일 안에 모두 넣게 되면 실행파일 하나로 Qt 프로그램을 실행 할 수 있습니다.
다만, 정적일크로 빌드한 프로그램은 필요한 라이브러리(Qtcore, QtGui 등) 이 모두 포함되어있어서 실행파일 자체만으로 용량을 많이 차지합니다.