구름

Qt 정적 라이브러리 빌드 본문

👨‍💻개발 (deprecated)

Qt 정적 라이브러리 빌드

rattan32 2016. 9. 24. 00:03

본 게시글은 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

Maintenance Tool 을 이용하여 라이브러리, 소스, 툴 등을 다운받고 관리 할 수 있습니다.
소스코드를 따로 받는방법도 있지만, 이 방법이 훨씬 깔끔하고 관리하기도 편한것 같습니다.
Qt 에서 Windows, macOS, Linux 모두 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 off
rem ====================CONFIGURE BEFORE RUN SCRIPT!!======================
set QtSrcDir=%CD%\qt-everywhere-opensource-src-5.7.0
set QtStaticDir=C:\Qt\5.7_Static
set MingwDir=C:\Qt\Tools\mingw530_32
set LANG = en
rem =======================================================================
 
PATH = %MingwDir%\bin;%MingwDir%\opt\bin;%SystemRoot%\system32;%SystemRoot%
 
set FILE_TO_PATCH=%QtSrcDir%\qtbase\mkspecs\win32-g++\qmake.conf
echo %FILE_TO_PATCH%
if exist %FILE_TO_PATCH%.patched goto skipPatch
type %FILE_TO_PATCH%>%FILE_TO_PATCH%.patched
echo.>>%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%
:skipPatch
 
set 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 :error
 
mingw32-make -r -k -j4
if ERRORLEVEL 1 goto :error
 
mingw32-make -k install
if ERRORLEVEL 1 goto :error
 
set FILE_TO_PATCH=%QtStaticDir%\mkspecs\win32-g++\qmake.conf
echo.>>%FILE_TO_PATCH%
echo CONFIG += static>>%FILE_TO_PATCH%
 
echo ============BUILT!============
goto exitX
:error
echo ============ERROR!============
:exitX
pause
cd %OldDir%
실제 환경에 맞게 경로를 설정해 준 뒤 아무 디렉토리에 "build_static_qt.bat" 이라는 이름으로 저장합니다.

빌드 후 설치

"build_static_qt.bat" 을 실행하고 1~3시간 가량 모든 작업이 끝날때 까지 기다립니다. (cpu 성능에따라 차이가 날 수 있습니다.)

Linux/macOS

의존성 항목 다운

빌드 전 의존성 항목을 설치합니다.
macOS 의 경우, 최신버전의 XCode 를 먼저 설치합니다.
Debian/Ubuntu/Mint
sudo apt-get install gcc g++ make wget
sudo apt-get install build-essential
sudo 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

homebrew

brew install coreutils

brew install binutils

brew install gnu-sed

MacPorts

port install bunutils

port install coreutils

port install gsed

Configure

 

터미널을 열어서 소스코드 압축 해제 디렉토리/Src/qtbase 로 이동 합니다.

./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

마지막으로 설치 디렉토리에 복사해줍니다.

공통

Qt Creator 는 Windows, macOS, Linux 모두 동일한 UI/UX 를 가집니다.

Qt Creator>Preference(설정)>Build & Run>Qt Versions
에서 Add 버튼을 누릅니다.

정저라이브러리가 빌드된 디렉토리 로 가서 qmake 파일을 선택합니다.

[/5.7/Src/qtbase/bin/qmake]

Kits 로 이동하여 Add 를 누릅니다.
Name 부분에 Project Build 부분에서 보여질 이름을 적어넣고 Qt version 에서 방금 만든 Qt version 을 선택한 후 OK 버튼을 눌러줍니다.

이제 프로젝트 생성 시 정적 빌드를 위한 도구가 생겼습니다. 기존 프로젝트 역시 Qt Creator -> Project -> Add Kit 에서 정적 빌드 도구를 추가 할 수 있습니다.

 

 

동적 링크로 만든 실행파일은 필요한 라이브러리 파일이 없으면 실행되지 않지만 정적링크로 필요한 라이브러리를 실행파일 안에 모두 넣게 되면 실행파일 하나로 Qt 프로그램을 실행 할 수 있습니다.

다만, 정적일크로 빌드한 프로그램은 필요한 라이브러리(Qtcore, QtGui 등) 이 모두 포함되어있어서 실행파일 자체만으로 용량을 많이 차지합니다.

 

Comments