Programming/Qt

[Qt] Static Build (exe 파일 단독 실행)

_SYPark 2023. 4. 20. 16:47
728x90

Qt Creator를 통해 빌드한 결과물인 exe 파일을 단독으로 실행하면 아래처럼 오류 메시지가 나오게 됩니다.

실행파일을 실행하기 위해선 Qtcore에 명시한 dll들이 필요한데 그 dll들이 없어서 위와 같이 오류가 뜨게 됩니다. 이러한 dll들을 자동으로 추가해주는 windeployqt라는 툴도 있습니다.

 

[Qt] windeployqt 사용하기

Qt5부터 사용할 수 있는 windeployqt는 빌드 시 생성한 실행파일을 단독으로 실행할 수 있게 필요한 라이브러리를 자동으로 추가해주는 툴입니다. 그 후 프로젝트가 저장된 폴더로 이동하면 Release

1d1cblog.tistory.com

이번에는 dll 없이 단독으로 실행할 수 있게 Static build 환경을 만들어보겠습니다.

 

먼저 Qt Maintenance를 실행해 빌드 환경과 Source를 설치합니다.

설치가 완료되었으면 Qt가 설치된 폴더로 이동 후 Static 이라는 이름의 폴더를 하나 만들어줍니다.

그리고 그 Static 폴더 내부에 5.15.2(버전) 폴더를 하나 더 생성 후 Qt\5.15.2\Src 폴더를 Qt\Static에 복사합니다.

복사가 다 됐다면 Qt\Static\Src\qtbase\mkspecs\win32-g++ 폴더의 qmake.conf 에 아래 내용을 추가합니다.

QMAKE_LFLAGS += -static -static-libgcc
QMAKE_CFLAGS_RELEASE -= -O2
QMAKE_CFLAGS_RELEASE += -Os -momit-leaf-frame-pointer
DEFINES += QT_STATIC_BUILD

다음으로 CMD를 실행 후 환경 변수를 추가합니다. mingw은 설치된 버전에 맞춥니다.

다음으로 Qt Console을 실행하고 Qt\Static\Src로 이동 후 아래 코드를 실행합니다.

주의할 점은 -prefix 뒤 폴더는 생성한 폴더에 맞춰야 합니다.

configure -static -release -platform win32-g++ -prefix C:\Qt\Static\5.15.2 -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-freetype -opengl desktop -no-openssl -opensource -confirm-license -make libs -nomake tools -nomake examples -nomake tests

configure이 끝났으면 마지막으로 아래 두 명령을 실행합니다. 아래 두 작업에는 대략 30분 ~ 1시간이 소요됩니다.

mingw32-make -k -j4
mingw32-make -k install

만약 Make 시에 아래처럼 Qml 쪽 에러가 나오고 JSC::Yarr::newlineCreate라는 에러 메시지가 나온다면 https://www.python.org/downloads/ 링크에서 Python을 다운로드 해줍니다.

설치 시에 Add Python.exe to PATH를 체크합니다.

make가 모두 끝났으면 Qt\Static\5.15.2\mkspecs\win32-g++에 있는 qmake.conf를 열어 아래 코드를 추가합니다.

CONFIG += static

이제 Qt Creator를 실행해 [Edit] > [Preference]를 실행합니다. [Qt Versions]에서 Add를 누른 후 Qt\Static\5.15.2\bin에 qmake.exe를 선택한 후 Apply 해줍니다.

다음으로 [Kits]로 이동해 Add 후 아래처럼 Qt Version에 위에서 만든 버전을 선택 후 적용합니다.

마지막으로 Projects에서 위에서 만든 Kit를 적용 후 Build합니다.

 

makersweb - Windows환경에서 mingw로 Qt 5.10 정적(static)빌드

환경: 윈도우7, Qt5.10 기본적으로 qt.io에서 배포된 Qt는 사전 빌드된 라이브러리들이 동적으로 링크된다. 즉, 응용프로그램이 실행 될때 사전 빌드된 DLL을 동적으로 참조한다. 문제는 이런 환경에

makersweb.net

 

728x90