macOS용 Qt - 배포

이 문서에서는 macOS 번들을 생성하고 애플리케이션이 런타임에 필요한 리소스를 찾도록 하는 방법을 설명합니다. Qt 소스 패키지와 함께 제공되는 플러그 앤 페인트 예제 애플리케이션을 배포하는 절차를 보여드립니다.

macOS용 Qt 인스톨러에는 여기에 설명된 절차를 자동화하는 배포 도구가 포함되어 있습니다.

번들

macOS에서 GUI 애플리케이션은 번들에서 빌드하고 실행해야 하며, 번들은 Finder에서 볼 때 단일 엔티티로 표시되는 디렉토리 구조입니다. 애플리케이션의 번들에는 일반적으로 실행 파일과 애플리케이션에 필요한 모든 리소스가 포함되어 있습니다. 다음은 애플리케이션 번들 구조의 스냅샷입니다:

번들은 사용자에게 많은 이점을 제공합니다:

  • 단일 엔터티로 식별되므로 설치가 쉽습니다.
  • 번들에 대한 정보는 코드에서 액세스할 수 있습니다.

이는 macOS에만 해당되며 이 문서의 범위를 벗어납니다. 번들에 대한 자세한 내용은 Apple의 개발자 웹사이트를 참조하세요.

CMake를 사용하여 애플리케이션을 번들로 빌드하려면 실행 대상의 MACOSX_BUNDLE 속성을 설정합니다:

set_target_properties(plugandpaint PROPERTIES
    MACOSX_BUNDLE TRUE
)

qmake 애플리케이션에 대한 번들을 자동으로 생성합니다. 이를 비활성화하려면 애플리케이션의 프로젝트 파일에 다음 문을 추가합니다(.pro):

CONFIG-=app_bundle

정적 링크

배포할 파일이 몇 개만 있는 경우 정적으로 링크된 라이브러리를 사용하여 애플리케이션을 빌드할 수 있습니다.

정적으로 Qt 빌드하기

먼저 정적 버전의 Qt 라이브러리를 설치합니다. 플러그인을 사용할 수 없으며 이미지 포맷, SQL 드라이버 등과 같은 종속 라이브러리를 정적 링크로 빌드해야 한다는 점을 기억하세요.

cd /path/to/Qt
./configure -static <other parameters>

configure -help를 실행하여 사용 가능한 다양한 옵션을 확인할 수 있습니다.

애플리케이션을 정적 버전의 Qt에 링크하기

Qt가 정적으로 빌드되면 다음 단계는 빌드 파일을 재생성하고 애플리케이션을 다시 빌드하는 것입니다.

CMake 사용

정적 Qt 빌드에서 Qt 플러그인 링크와 같은 추가 로직을 제공하는 qt_add_executable wrapper 명령을 사용해야 합니다.

Apple 플랫폼용으로 빌드하려면 cmake_minimum_required() 을 3.21.1 이상으로 설정해야 합니다:

cmake_minimum_required(VERSION 3.21.1)

애플리케이션이 포함된 디렉토리로 이동합니다:

cd /path/to/Qt/examples/widgets/tools/plugandpaint/app

그런 다음 CMAKE_PREFIX_PATH 변수가 설치 접두사를 가리키도록 설정합니다. 이미 Cmake 빌드가 있는 경우 CMakeCache.txt 파일을 삭제합니다. 그런 다음 CMake를 다시 실행합니다:

cmake -DCMAKE_PREFIX_PATH=path/to/Qt/6.9.1/your_platform -S <source-dir> -B <build-dir> -G Ninja

또는 CMAKE_PREFIX_PATH 변수를 설정하는 편의 스크립트 qt-cmake 를 사용하세요.

path/to/Qt/6.9.1/your_platform/bin/qt-cmake -S <source-dir> -B <build-dir> -G Ninja

마지막으로 빌드 디렉터리로 이동하여 원하는 빌드 시스템을 실행합니다. 이 예에서는 Ninja 을 사용합니다.

cd path/to/build/dir
ninja

이제 모든 것이 오류 없이 컴파일되고 링크되었다면 배포할 수 있는 plugandpaint.app 번들이 준비되었을 것입니다. Qt 또는 Qt 애플리케이션이 설치되어 있지 않은 macOS를 실행하는 시스템에 번들을 설치해 보세요.

qmake 사용하기

먼저 애플리케이션이 들어 있는 디렉토리로 이동합니다:

cd /path/to/Qt/examples/widgets/tools/plugandpaint/app

그런 다음 qmake 을 실행하여 애플리케이션에 대한 새 메이크파일을 생성하고 클린 빌드를 수행하여 정적으로 링크된 실행 파일을 생성합니다:

make clean
qmake -config release
make

릴리스 라이브러리에 대해 링크하고 싶을 수 있으며 qmake 을 호출할 때 이를 지정할 수 있습니다. 바이너리 크기를 더 줄이기 위해 "데드 코드 스트리핑"을 활용할 수도 있습니다. -config release 매개변수 외에 LIBS+= -dead_stripqmake 으로 전달하여 이 작업을 수행할 수 있습니다.

다시 말하지만, 모든 것이 오류 없이 컴파일되고 연결되었다면 배포할 수 있는 plugandpaint.app 번들이 준비되어 있을 것입니다. Qt 또는 Qt 애플리케이션이 설치되어 있지 않은 macOS를 실행하는 시스템에 번들을 설치해 보세요.

연결된 라이브러리 확인

otool 을 사용하여 애플리케이션이 어떤 다른 라이브러리에 링크되어 있는지 확인할 수 있습니다:

otool -L plugandpaint.app/Contents/MacOs/plugandpaint

정적으로 링크된 플러그 앤 페인트의 출력은 다음과 같습니다:

plugandpaint.app/Contents/MacOS/plugandpaint:
/System/Library/Frameworks/Carbon.framework/Versions/A/Carbon
        (compatibility version 2.0.0, current version 128.0.0)
/System/Library/Frameworks/QuickTime.framework/Versions/A/QuickTime
        (compatibility version 1.0.0, current version 10.0.0)
/usr/lib/libz.1.dylib
        (compatibility version 1.0.0, current version 1.2.3)
/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices
        (compatibility version 1.0.0, current version 22.0.0)
/usr/lib/libstdc++.6.dylib
        (compatibility version 7.0.0, current version 7.3.0)
/usr/lib/libgcc_s.1.dylib
        (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libmx.A.dylib
        (compatibility version 1.0.0, current version 92.0.0)
/usr/lib/libSystem.B.dylib
        (compatibility version 1.0.0, current version 88.0.0)

출력에 Qt 라이브러리가 표시되면 컴퓨터에 동적 및 정적 Qt 라이브러리가 모두 설치되어 있다는 뜻입니다. 링커는 항상 정적 링크보다 동적 링크를 선택합니다. 정적 라이브러리만 사용하려면 다음 중 하나를 수행하면 됩니다:

  • 애플리케이션을 링크하는 동안 Qt 동적 라이브러리(.dylibs)를 다른 디렉토리로 이동했다가 다시 이동합니다,
  • 또는 Makefile 을 편집하고 Qt 라이브러리에 대한 링크 줄을 정적 라이브러리의 절대 경로로 바꿉니다.

예를 들어, 다음을

-lQtGui

를 이것으로 바꿉니다:

/where/static/qt/lib/is/libQtGui.a

플러그 앤 페인트 예제는 여러 구성 요소로 이루어져 있습니다: 핵심 애플리케이션(플러그 앤 페인트), 기본 도구추가 필터 플러그인. 정적 링크 방식으로는 플러그인을 배포할 수 없으므로 지금까지 준비한 번들은 불완전합니다. 애플리케이션은 실행되지만 누락된 플러그인으로 인해 기능이 비활성화됩니다. 플러그인 기반 애플리케이션을 배포하려면 macOS에 특화된 프레임워크 접근 방식을 사용해야 합니다.

프레임워크

이 접근 방식에서는 Qt 런타임이 애플리케이션 번들과 함께 올바르게 재배포되고 플러그인이 애플리케이션이 찾을 수 있도록 올바른 위치에 설치되어 있는지 확인합니다.

프레임워크 접근 방식에서 애플리케이션과 함께 Qt를 배포하는 방법에는 두 가지가 있습니다:

  • 애플리케이션 번들 내의 비공개 프레임워크.
  • 표준 프레임워크(또는 설치된 바이너리에 있는 Qt 프레임워크 사용).

첫 번째 옵션은 특별한 방식으로 Qt를 빌드했거나 프레임워크가 있는지 확인하려는 경우에 좋습니다. Qt 프레임워크를 어디에 배치하느냐에 따라 달라집니다.

두 번째 옵션은 많은 Qt 애플리케이션이 있고 여러 버전이 아닌 단일 Qt 프레임워크를 사용하려는 경우 유용합니다.

프레임워크로서 Qt 빌드하기

Qt를 설치할 때 기본값인 프레임워크로서의 Qt를 /path/to/Qt 디렉터리에 이미 설치했다고 가정합니다. 프레임워크 없이 Qt를 빌드하는 방법에 대한 자세한 내용은 macOS용 Qt - 특정 문제 문서를 참조하십시오.

설치 시 프레임워크의 식별 이름이 설정됩니다. 이 이름은 동적 링커(dyld)가 애플리케이션의 라이브러리를 찾는 데 사용됩니다.

애플리케이션을 프레임워크로서 Qt에 링크하기

Qt를 프레임워크로 빌드한 후에는 플러그 앤 페인트 애플리케이션을 빌드할 수 있습니다.

CMake 사용

Apple 플랫폼용으로 빌드하려면 cmake_minimum_required() 을 3.21.1 이상으로 설정해야 합니다:

cmake_minimum_required(VERSION 3.21.1)

애플리케이션이 들어 있는 디렉토리로 이동합니다:

cd /path/to/Qt/examples/widgets/tools/plugandpaint/app

그런 다음 CMAKE_PREFIX_PATH 변수가 설치 접두사를 가리키도록 설정합니다. 이미 Cmake 빌드가 있는 경우 CMakeCache.txt 파일을 삭제합니다. 그런 다음 CMake를 다시 실행합니다:

cmake -DCMAKE_PREFIX_PATH=path/to/Qt/6.9.1/your_platform -S <source-dir> -B <build-dir> -G Ninja

또는 CMAKE_PREFIX_PATH 변수를 설정하는 편의 스크립트 qt-cmake 를 사용하세요.

path/to/Qt/6.9.1/your_platform/bin/qt-cmake -S <source-dir> -B <build-dir> -G Ninja

마지막으로 빌드 디렉터리로 이동하여 원하는 빌드 시스템을 실행합니다. 이 예에서는 Ninja 을 사용합니다.

cd path/to/build/dir
ninja

이제 모든 것이 오류 없이 컴파일되고 링크되었다면 배포할 수 있는 plugandpaint.app 번들이 준비되었을 것입니다. Qt 또는 Qt 애플리케이션이 설치되어 있지 않은 macOS를 실행하는 시스템에 번들을 설치해 보세요.

qmake 사용하기

먼저 애플리케이션이 들어 있는 디렉토리로 이동합니다:

cd /path/to/Qt/examples/widgets/tools/plugandpaint/app

qmake 을 실행하여 애플리케이션에 대한 새 메이크파일을 만들고 클린 빌드를 수행하여 동적으로 링크된 실행 파일을 생성합니다:

make clean
qmake -config release
make

이렇게 하면 핵심 애플리케이션이 빌드됩니다. 다음을 사용하여 플러그인을 빌드합니다:

cd ../plugandpaint/plugins
make clean
qmake -config release
make

이제 Qt 프레임워크(예: Qt GUI)에 대해 otool 을 실행합니다:

otool -L QtGui.framework/QtGui

다음과 같은 출력이 표시됩니다:

QtGui.framework/QtGui:
/path/to/Qt/lib/QtGui.framework/Versions/4.0/QtGui
        (compatibility version 4.0.0, current version 4.0.1)
/System/Library/Frameworks/Carbon.framework/Versions/A/Carbon
        (compatibility version 2.0.0, current version 128.0.0)
/System/Library/Frameworks/QuickTime.framework/Versions/A/QuickTime
        (compatibility version 1.0.0, current version 10.0.0)
/path/to/Qt/QtCore.framework/Versions/4.0/QtCore
        (compatibility version 4.0.0, current version 4.0.1)
/usr/lib/libz.1.dylib
        (compatibility version 1.0.0, current version 1.2.3)
/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices
        (compatibility version 1.0.0, current version 22.0.0)
/usr/lib/libstdc++.6.dylib
        (compatibility version 7.0.0, current version 7.3.0)
/usr/lib/libgcc_s.1.dylib
        (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libmx.A.dylib
        (compatibility version 1.0.0, current version 92.0.0)
/usr/lib/libSystem.B.dylib
        (compatibility version 1.0.0, current version 88.0.0)

Qt 프레임워크의 경우, 첫 번째 줄(예: path/to/Qt/lib/QtGui.framework/Versions/4/QtGui (compatibility version 4.0.0, current version 4.0.1))은 동적 링커(dyld)에서 사용하는 프레임워크의 식별 이름이 됩니다.

그러나 애플리케이션을 배포할 때 사용자가 지정된 위치에 Qt 프레임워크가 설치되어 있지 않을 수 있습니다. 따라서 합의된 위치에 프레임워크를 제공하거나 번들에 프레임워크를 저장해야 합니다. 어떤 솔루션을 선택하든 프레임워크가 적절한 식별 이름을 반환하고 애플리케이션이 이러한 이름을 찾는지 확인해야 합니다. 다행히도 install_name_tool 명령줄 도구로 이를 제어할 수 있습니다.

install_name_tool-id-change 의 두 가지 모드로 작동합니다. -id 모드는 라이브러리 및 프레임워크용이며 새 식별 이름을 지정할 수 있습니다. 애플리케이션의 경로를 변경할 때는 -change 모드를 사용합니다.

Qt 프레임워크를 플러그 앤 페인트 번들에 복사하여 이를 테스트해 보겠습니다. 번들에 대한 otool 의 출력을 보면 QtCoreQtGui 프레임워크를 모두 번들에 복사해야 한다는 것을 알 수 있습니다. 여기서는 번들을 빌드한 디렉토리에 있다고 가정하겠습니다.

mkdir plugandpaint.app/Contents/Frameworks
cp -R /path/to/Qt/lib/QtCore.framework
        plugandpaint.app/Contents/Frameworks
cp -R /path/to/Qt/lib/QtGui.framework
       plugandpaint.app/Contents/Frameworks

먼저 번들 내에 Frameworks 디렉터리를 만듭니다. 이는 macOS 애플리케이션 규칙을 따릅니다. 그런 다음 프레임워크를 새 디렉토리에 복사합니다. 프레임워크에는 심볼릭 링크가 포함되어 있으므로 -R 옵션을 사용합니다.

install_name_tool -id @executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
       plugandpaint.app/Contents/Frameworks/QtCore.framework/Versions/4.0/QtCore
install_name_tool -id @executable_path/../Frameworks/QtGui.framework/Versions/4.0/QtGui
       plugandpaint.app/Contents/Frameworks/QtGui.framework/Versions/4.0/QtGui

그런 다음 install_name_tool 을 실행하여 프레임워크의 식별 이름을 설정합니다. -id 뒤의 첫 번째 인수는 새 이름이고, 두 번째 인수는 이름을 바꾸려는 프레임워크입니다. @executable_path 텍스트는 특수 dyld 변수로 dyld 에 실행 파일의 위치를 찾으라고 지시합니다. 새 이름은 이러한 프레임워크가 Frameworks 디렉터리 바로 아래 디렉터리에 있음을 지정합니다.

install_name_tool -change path/to/Qt/lib/QtCore.framework/Versions/4.0/QtCore
        @executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
        plugandpaint.app/Contents/MacOs/plugandpaint
install_name_tool -change path/to/qt/lib/QtGui.framework/Versions/4.0/QtGui
        @executable_path/../Frameworks/QtGui.framework/Versions/4.0/QtGui
        plugandpaint.app/Contents/MacOs/plugandpaint

이제 동적 링커는 QtCoreQtGui 을 찾을 위치를 알고 있습니다. 애플리케이션도 install_name_tool-change 모드를 사용하여 라이브러리를 찾을 수 있는 위치를 알고 있는지 확인해야 합니다. 이는 기본적으로 앞서 설정한 식별 이름을 프레임워크에 일치시키기 위한 문자열 교체로 이루어집니다.

마지막으로 QtGui 프레임워크는 QtCore 에 의존하므로 QtGui 에 대한 참조를 변경하는 것을 잊지 말아야 합니다:

install_name_tool -change path/to/Qt/lib/QtCore.framework/Versions/4.0/QtCore
        @executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
        plugandpaint.app/Contents/Frameworks/QtGui.framework/Versions/4.0/QtGui

그런 다음 otool 을 다시 실행하여 애플리케이션이 라이브러리를 찾을 수 있는지 확인합니다.

플러그 앤 페인트 예제의 플러그인은 흥미롭습니다. 플러그인에서 따라야 할 기본 단계는 다음과 같습니다:

  • 플러그인을 번들 안에 넣습니다,
  • install_name_tool 을 실행하여 플러그인이 올바른 라이브러리를 사용하고 있는지 확인하고,
  • 그리고 애플리케이션이 플러그인을 찾을 위치를 알고 있는지 확인하는 것입니다.

번들에서 원하는 위치에 플러그인을 넣을 수 있지만 가장 좋은 위치는 콘텐츠/플러그인 아래에 넣는 것입니다. 플러그 앤 페인트 플러그인을 빌드할 때 .pro 파일의 DESTDIR 변수를 기반으로 플러그인의 .dylib 파일은 plugandpaint 디렉터리 아래의 plugins 하위 디렉터리에 있습니다. 이 디렉터리를 올바른 위치로 옮기기만 하면 됩니다.

mv plugins plugandpaint.app/Contents

예를 들어 기본 도구 플러그인의 .dylib 파일에서 otool 을 실행하면 다음과 같은 정보를 얻을 수 있습니다.

libpnp_basictools.dylib:
libpnp_basictools.dylib
       (compatibility version 0.0.0, current version 0.0.0)
/path/to/Qt/lib/QtGui.framework/Versions/4.0/QtGui
       (compatibility version 4.0.0, current version 4.0.1)
/System/Library/Frameworks/Carbon.framework/Versions/A/Carbon
       (compatibility version 2.0.0, current version 128.0.0)
/System/Library/Frameworks/QuickTime.framework/Versions/A/QuickTime
       (compatibility version 1.0.0, current version 10.0.0)
/path/to/Qt/lib/QtCore.framework/Versions/4.0/QtCore
       (compatibility version 4.0.0, current version 4.0.1)
/usr/lib/libz.1.dylib
       (compatibility version 1.0.0, current version 1.2.3)
/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices
       (compatibility version 1.0.0, current version 22.0.0)
/usr/lib/libstdc++.6.dylib
       (compatibility version 7.0.0, current version 7.3.0)
/usr/lib/libgcc_s.1.dylib
       (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libmx.A.dylib
       (compatibility version 1.0.0, current version 92.0.0)
/usr/lib/libSystem.B.dylib
       (compatibility version 1.0.0, current version 88.0.0)

그러면 플러그인이 빌드된 Qt 프레임워크에 링크되어 있음을 알 수 있습니다. 플러그인이 애플리케이션 번들의 프레임워크를 사용하도록 하려면 애플리케이션에서와 같은 방식으로 변경합니다. 예를 들어 기본 도구 플러그인의 경우입니다:

install_name_tool -change /path/to/Qt/lib/QtCore.framework/Versions/4.0/QtCore
        @executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
        plugandpaint.app/Contents/plugins/libpnp_basictools.dylib
install_name_tool -change /path/to/Qt/lib/QtGui.framework/Versions/4.0/QtGui
        @executable_path/../Frameworks/QtGui.framework/Versions/4.0/QtGui
        plugandpaint.app/Contents/plugins/libpnp_basictools.dylib

또한 애플리케이션이 플러그인을 찾을 수 있도록 tools/plugandpaint/mainwindow.cpp 의 코드를 cdUp()로 수정해야 합니다. mainwindow.cpp 파일에 다음 코드를 추가합니다:

#elif defined(Q_OS_MAC)
if (pluginsDir.dirName() == "MacOS") {
    pluginsDir.cdUp();
}
#endif
tools/plugandpaint/mainwindow.cpp 의 추가 코드는 이미지와 같이 Finder에서 플러그인을 볼 수 있게 해줍니다.

Qt SQL 드라이버나 이미지 포맷을 추가하는 등 Qt를 확장하는 플러그인을 추가할 수도 있습니다. 플러그인 문서에 설명된 디렉토리 구조를 따르고 QCoreApplication::libraryPaths()에 포함되어 있는지 확인하기만 하면 됩니다. 앞서 설명한 절차에 따라 이미지 포맷을 빠르게 추가해 보겠습니다.

Qt의 이미지 포맷 플러그인을 번들에 복사합니다:

cp -R /path/to/Qt/plugins/imageformats
        pluginandpaint.app/Contents/plugins

install_name_tool 을 사용하여 번들의 프레임워크에 플러그인을 연결합니다:

install_name_tool -change /path/to/Qt/lib/QtGui.framework/Versions/4.0/QtGui
        @executable_path/../Frameworks/QtGui.framework/Versions/4.0/QtGui
        plugandpaint.app/Contents/plugins/imageformats/libqjpeg.dylib
install_name_tool -change /path/to/Qt/lib/QtCore.framework/Versions/4.0/QtCore
        @executable_path/../Frameworks/QtCore.framework/Versions/4.0/QtCore
        plugandpaint.app/Contents/plugins/imageformats/libqjpeg.dylib

tools/plugandpaint/main.cpp 에서 소스 코드를 업데이트하여 새 플러그인을 찾습니다. QApplication 를 구성한 후 다음 코드를 추가합니다:

QDir dir(QCoreApplication::applicationDirPath());
dir.cdUp();
dir.cd("plugins");
QCoreApplication::setLibraryPaths(QStringList(dir.absolutePath()));

먼저 애플리케이션에 이 디렉터리에서 플러그인만 찾도록 지시합니다. 우리의 경우 애플리케이션이 번들과 함께 배포하는 플러그인만 찾도록 합니다. 만약 우리가 더 큰 Qt 설치의 일부였다면 QCoreApplication::addLibraryPath()를 대신 사용할 수 있었을 것입니다.

경고: 플러그인을 배포하는 동안 소스 코드를 변경하면 애플리케이션이 다시 빌드될 때 기본 식별 이름이 재설정됩니다. 따라서 install_name_tool 을 사용하여 애플리케이션이 번들의 올바른 Qt 프레임워크에 링크되도록 하는 과정을 반복해야 합니다.

이제 애플리케이션을 다른 macOS 시스템으로 이동하여 Qt를 설치하지 않고도 실행할 수 있어야 합니다. 또는 번들 외부에 있는 프레임워크를 다른 디렉토리로 이동하고 애플리케이션이 여전히 실행되는지 확인할 수 있습니다.

프레임워크를 번들 외부의 다른 위치에 저장하는 경우에도 애플리케이션을 연결하는 기술은 비슷하며, 애플리케이션과 프레임워크가 플러그인뿐만 아니라 Qt 라이브러리를 찾을 위치에 일치하는지 확인해야 합니다.

애플리케이션 패키지 생성하기

애플리케이션을 정적으로 또는 프레임워크로 Qt에 연결하면 애플리케이션을 배포할 준비가 완료된 것입니다. 자세한 내용은 Apple 개발자 웹사이트를 참조하십시오.

애플리케이션을 배포하는 과정에는 몇 가지 함정이 있지만, 다양한 문제를 알고 나면 모든 macOS 사용자가 즐길 수 있는 패키지를 쉽게 만들 수 있습니다.

애플리케이션 종속성

Qt 플러그인

모든 Qt GUI 애플리케이션은 Qt에서 Qt 플랫폼 추상화 (QPA) 계층을 구현하는 플러그인이 필요합니다. macOS의 경우, 플랫폼 플러그인의 이름은 libqcocoa.dylib 입니다. 이 파일은 배포 디렉터리 아래의 특정 하위 디렉토리(기본값은 platforms)에 위치해야 합니다. 또는 아래에 설명된 대로 Qt가 플러그인을 찾는 데 사용하는 검색 경로를 조정할 수 있습니다.

응용 프로그램이 JPEG 이미지 포맷 플러그인이나 SQL 드라이버 플러그인과 같은 하나 이상의 Qt 플러그인에 의존할 수도 있습니다. 애플리케이션에 필요한 모든 Qt 플러그인을 배포해야 합니다. 플랫폼 플러그인과 마찬가지로 각 플러그인 유형은 배포 디렉토리의 특정 하위 디렉토리(예: imageformats 또는 sqldrivers)에 위치해야 합니다.

Qt 플러그인(및 몇 가지 다른 경로)의 검색 경로는 QtCore 라이브러리에 하드 코딩되어 있습니다. 기본적으로 첫 번째 플러그인 검색 경로는 /path/to/Qt/plugins 로 하드 코딩됩니다. 하지만 미리 정해진 경로를 사용하면 몇 가지 단점이 있습니다. 예를 들어 대상 컴퓨터에 존재하지 않을 수 있습니다. 따라서 다양한 대안을 확인하여 Qt 플러그인을 찾을 수 있는지 확인해야 합니다:

Qt 플러그인 생성 방법 문서는 Qt 애플리케이션용 플러그인을 빌드하고 배포할 때 주의해야 할 문제를 간략하게 설명합니다.

추가 라이브러리

otool 을 사용하여 애플리케이션이 어떤 라이브러리에 링크하고 있는지 확인할 수 있습니다. 애플리케이션 경로를 인수로 사용하여 실행하세요:

otool -L MyApp.app/Contents/MacOS/MyApp

컴파일러별 라이브러리를 애플리케이션과 함께 재배포할 필요는 거의 없습니다. 그러나 Qt는 macOS에서 여러 가지 방법으로 구성, 빌드 및 설치할 수 있으므로 애플리케이션을 배포하는 방법에는 여러 가지가 있습니다. 일반적으로 목표는 애플리케이션을 배포하는 방법을 결정하는 데 도움이 됩니다. 마지막 섹션에서는 애플리케이션을 배포할 때 반드시 알아야 할 몇 가지 사항을 설명합니다.

Mac 배포 도구

Mac 배포 도구는 QTDIR/bin/macdeployqt에서 찾을 수 있으며, Qt 라이브러리를 개인 프레임워크로 포함하는 배포 가능한 애플리케이션 번들을 생성하는 프로세스를 자동화하도록 설계되었습니다.

Mac 배포 도구는 다음 규칙( -no-plugins 옵션이 사용되지 않는 경우)에 따라 Qt 플러그인도 배포합니다:

  • 플랫폼 플러그인은 항상 배포됩니다.
  • 디버그 버전의 플러그인은 배포되지 않습니다.
  • 디자이너 플러그인은 배포되지 않습니다.
  • 이미지 형식 플러그인은 항상 배포되지만, 애플리케이션에서 애플리케이션이 Qt SVG 모듈을 사용하는 경우에만 배포됩니다.
  • 아이콘 엔진 플러그인은 항상 배포됩니다.
  • 인쇄 지원 플러그인은 항상 배포됩니다.
  • SQL 드라이버 플러그인은 애플리케이션에서 Qt SQL 모듈을 사용하는 경우 배포됩니다.
  • 접근성 플러그인은 항상 배포됩니다.
  • 스타일 플러그인은 항상 배포됩니다.

중요: Mac 배포 도구를 사용하지 않기로 선택한 경우 배포 패키지에 이러한 플러그인이 포함되어 있는지 확인해야 합니다.

애플리케이션 번들에 타사 라이브러리를 포함하려면 번들을 만든 후 라이브러리를 번들에 수동으로 복사합니다.

macdeployqt 다음 옵션을 지원합니다:

옵션설명
-verbose=<0-3>0 = 출력 없음, 1 = 오류/경고(기본값), 2 = 정상, 3 = 디버그
-no-plugins플러그인 배포 건너뛰기
-dmg.dmg 디스크 이미지 생성
-no-strip바이너리에서 '스트립' 실행하지 않기
-use-debug-libs프레임워크 및 플러그인의 디버그 버전으로 배포( -no-strip)를 의미합니다.
-executable=<path>지정된 실행 파일도 배포된 프레임워크를 사용하도록 합니다.
-qmldir=<path>지정된 경로에 .qml 파일에서 사용하는 임포트를 배포합니다.
-qmlimport=<path>지정된 경로를 QML 가져오기 검색 위치에 추가합니다.
-always-overwrite대상 파일이 존재하더라도 파일 복사
-codesign=<ident>모든 실행 파일에서 지정된 ID로 codesign 실행
-hardened-runtime코드 서명 시 강화된 런타임 활성화
-timestamp코드 서명 시 보안 타임스탬프 포함(인터넷 연결 필요)
-sign-for-notarization=<ident>공증에 필요한 옵션을 활성화합니다(인터넷 연결 필요). 활성화된 옵션은 -hardened-runtime, -timestamp-codesign=<ident>
-appstore-compliant비공개 API를 사용하는 컴포넌트의 배포 건너뛰기
-libpath=<path>라이브러리 검색 경로에 지정된 경로 추가
-fs=<filesystem>.dmg 디스크 이미지에 사용되는 파일 시스템 설정(기본값은 HFS+)

참고: macOS High Sierra에는 새로운 Apple 파일 시스템(APFS)이 도입되었습니다. 이전 버전의 macOS에서는 APFS로 포맷된 .dmg 파일을 읽을 수 없습니다. 기본적으로 macdeployqt 은 현재 Qt에서 지원하는 모든 버전의 macOS와의 호환성을 위해 이전 HFS+ 파일 시스템을 사용합니다. 다른 파일 시스템을 지정하려면 -fs 옵션을 사용하세요.

볼륨 이름

-dmg 으로 만든 디스크 이미지의 볼륨 이름(열린 .dmg 파일의 창 제목에 표시되는 텍스트)은 macdeployqt 을 실행할 때 애플리케이션의 경로를 기반으로 합니다. 예를 들어 Qt Quick 애플리케이션의 디스크 이미지를 만드는 다음 명령을 생각해 보세요:

macdeployqt /Users/foo/myapp-build/MyApp.app -qmldir=/Users/foo/myapp/qml -dmg

결과 볼륨 이름은 다음과 같습니다:

/Users/foo/myapp-build/MyApp.app

볼륨 이름에 배포 머신의 경로가 아닌 애플리케이션 이름만 포함되도록 하려면 동일한 디렉터리에서 macdeployqt 을 실행합니다:

cd /Users/foo/myapp-build
macdeployqt MyApp.app -qmldir=/Users/foo/myapp/qml -dmg

그러면 결과 볼륨 이름이 됩니다:

MyApp.app

자격

When 서명하면 macdeployqt 은 애플리케이션 번들의 Contents/Resources/ 하위 디렉터리에서 찾은 첫 번째 .entitlements 파일을 자동으로 사용합니다(있는 경우). 오류를 방지하려면 이 폴더에 최대 하나의 .entitlements 파일이 있는지 확인하세요.

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.