macOS용 Qt - 배포
이 문서는 macOS 번들을 생성하고, 애플리케이션이 실행 시 필요한 리소스를 올바르게 찾을 수 있도록 하는 방법을 설명합니다. Qt 소스 패키지에 포함된 Plug & Paint 예제 애플리케이션을 배포하는 과정을 예시로 보여드립니다.
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_add_executable 래퍼 명령을 사용해야 합니다. 이 명령은 정적 Qt 빌드에서 Qt 플러그인을 링크하는 등의 추가 로직을 제공합니다.
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.12.0/your_platform -S <source-dir> -B <build-dir> -G Ninja또는 CMAKE_PREFIX_PATH 변수를 자동으로 설정해 주는 편의 스크립트 qt-cmake 를 사용할 수도 있습니다.
path/to/Qt/6.12.0/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 `을 실행하여 애플리케이션용 새 makefile을 생성하고, 클린 빌드를 수행하여 정적 링크된 실행 파일을 생성합니다:
make clean
qmake -config release
make아마도 릴리스 라이브러리를 사용하여 링크하고 싶을 텐데, qmake 을 호출할 때 이를 지정할 수 있습니다. 바이너리 크기를 더욱 줄이기 위해 “사망 코드 제거(dead code stripping)” 기능을 활용하는 것도 좋습니다. 이를 위해서는 -config release 매개변수 외에도 LIBS+= -dead_strip 을 qmake 에 전달하면 됩니다.
다시 한 번 말씀드리지만, 모든 것이 오류 없이 컴파일 및 링크되었다면 배포 준비가 완료된 plugandpaint.app 번들이 생성되었을 것입니다. Qt나 Qt 애플리케이션이 설치되어 있지 않은 macOS 시스템에 이 번들을 설치해 보십시오.
링크된 라이브러리 확인
otool 를 사용하여 애플리케이션이 어떤 다른 라이브러리에 링크되어 있는지 확인할 수 있습니다:
otool -L plugandpaint.app/Contents/MacOs/plugandpaint다음은 정적 링크된 Plug & Paint의 출력 예시입니다:
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.aPlug & Paint 예제는 핵심 애플리케이션(Plug & Paint), Basic Tools 및 Extra Filters 플러그인 등 여러 구성 요소로 이루어져 있습니다. 정적 링크 방식을 사용해서는 플러그인을 배포할 수 없기 때문에, 지금까지 준비한 번들은 불완전합니다. 애플리케이션은 실행되지만, 플러그인이 누락되어 기능이 비활성화됩니다. 플러그인 기반 애플리케이션을 배포하려면 macOS에 특화된 프레임워크 방식을 사용해야 합니다.
프레임워크
이 방식에서는 Qt 런타임이 애플리케이션 번들과 함께 올바르게 재배포되고, 애플리케이션이 플러그인을 찾을 수 있도록 플러그인이 올바른 위치에 설치되었는지 확인해야 합니다.
프레임워크 방식에서 애플리케이션과 함께 Qt를 배포하는 방법에는 두 가지가 있습니다:
- 애플리케이션 번들 내의 전용 프레임워크.
- 표준 프레임워크(또는 설치된 바이너리의 Qt 프레임워크를 사용).
첫 번째 옵션은 Qt를 특수한 방식으로 빌드했거나 프레임워크가 반드시 존재하도록 보장해야 하는 경우에 적합합니다. 이는 단순히 Qt 프레임워크를 어디에 배치하느냐의 문제입니다.
두 번째 옵션은 Qt 애플리케이션이 여러 개 있고, 각 애플리케이션이 여러 버전의 Qt 프레임워크 대신 단일 Qt 프레임워크를 사용하도록 하고 싶은 경우에 적합합니다.
Qt를 프레임워크로 빌드하기
Qt를 프레임워크로 이미 설치했다고 가정합니다. 이는 Qt 설치 시 기본 설정이며, /path/to/Qt 디렉터리에 위치합니다. 프레임워크 없이 Qt를 빌드하는 방법에 대한 자세한 내용은 Qt for macOS - 특정 문제 문서를 참조하십시오.
설치 시 프레임워크의 식별명이 설정됩니다. 이 이름은 동적 링커(dyld)가 애플리케이션용 라이브러리를 찾는 데 사용됩니다.
애플리케이션을 Qt 프레임워크로 링크하기
Qt를 프레임워크로 빌드한 후, Plug & Paint 애플리케이션을 빌드할 수 있습니다.
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.12.0/your_platform -S <source-dir> -B <build-dir> -G Ninja또는 CMAKE_PREFIX_PATH 변수를 자동으로 설정해 주는 편의 스크립트 qt-cmake 를 사용할 수도 있습니다.
path/to/Qt/6.12.0/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/appqmake 를 실행하여 애플리케이션용 새 makefile을 생성하고, clean 빌드를 수행하여 동적 링크된 실행 파일을 생성하십시오:
make clean
qmake -config release
make이렇게 하면 핵심 애플리케이션이 빌드됩니다. 플러그인을 빌드하려면 다음 명령을 사용하십시오:
cd ../plugandpaint/plugins
make clean
qmake -config release
make이제 Qt 프레임워크(예: Qt GUI)에 대해 ` otool `를 실행합니다:
다음과 같은 출력이 표시됩니다:
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 프레임워크를 Plug & Paint 번들로 복사하여 이를 테스트해 봅시다. otool 에서 해당 번들에 대한 출력을 확인해 보면, QtCore 및 QtGui 프레임워크를 모두 번들로 복사해야 함을 알 수 있습니다. 여기서는 번들을 빌드한 디렉토리에 있다고 가정하겠습니다.
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이제 동적 링커는 ` QtCore `와 ` QtGui`를 어디에서 찾아야 하는지 알게 되었습니다. 이제 ` 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 를 다시 실행하면 애플리케이션이 라이브러리를 찾을 수 있음을 확인할 수 있습니다.
Plug & Paint 예제의 플러그인은 이 과정을 더욱 흥미롭게 만듭니다. 플러그인을 사용할 때 따라야 할 기본 단계는 다음과 같습니다:
- 플러그인을 번들 내에 넣고,
install_name_tool를 실행하여 플러그인이 올바른 라이브러리를 사용하고 있는지 확인하고,- 애플리케이션이 플러그인을 찾을 위치를 정확히 알고 있는지 확인합니다.
플러그인은 번들 내 원하는 곳에 배치할 수 있지만, 가장 좋은 위치는 Contents/Plugins 아래입니다. Plug & Paint 플러그인을 빌드했을 때, 해당 플러그인의 .pro 파일에 지정된 DESTDIR 변수를 기준으로, 플러그인의 .dylib 파일들은 plugandpaint 디렉터리 아래의 plugins 하위 디렉터리에 위치합니다. 이 디렉터리를 올바른 위치로 이동하기만 하면 됩니다.
mv plugins plugandpaint.app/Contents예를 들어, Basic Tools 플러그인의 .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 프레임워크에 링크되어 있음을 확인할 수 있습니다. 플러그인이 애플리케이션 번들에 포함된 프레임워크를 사용하도록 하려면, 애플리케이션을 처리할 때와 동일한 방식으로 플러그인을 수정해야 합니다. 예를 들어 Basic Tools 플러그인의 경우:
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_MACOS)
if (pluginsDir.dirName() == "MacOS") {
pluginsDir.cdUp();
}
#endif![]() | tools/plugandpaint/mainwindow.cpp 에 추가된 코드를 통해 그림과 같이 파인더에서 플러그인을 확인할 수 있습니다.Qt를 확장하는 플러그인, 예를 들어 SQL 드라이버나 이미지 형식을 추가할 수도 있습니다. 플러그인 문서에 설명된 디렉터리 구조를 따르고, 해당 플러그인이 QCoreApplication::libraryPaths()에 포함되도록 하면 됩니다. 앞서 설명한 절차를 따라 이미지 형식을 예로 들어 간단히 이 작업을 수행해 보겠습니다. Qt Image Formats 플러그인을 번들로 복사합니다:
먼저, 애플리케이션이 이 디렉터리에서만 플러그인을 검색하도록 지시합니다. 이 경우, 애플리케이션이 번들과 함께 배포하는 플러그인만 검색하도록 하고자 합니다. 더 큰 규모의 Qt 설치 환경의 일부라면 대신 ` QCoreApplication::addLibraryPath()`를 사용할 수도 있습니다. |
경고: 플러그인을 배포하는과정에서 소스 코드가 변경되면, 애플리케이션을 재빌드할 때 기본 식별명이 초기화됩니다. 따라서 install_name_tool 를 사용하여 애플리케이션이 번들 내의 올바른 Qt 프레임워크에 연결되도록 하는 과정을 반드시 반복해야 합니다.
이제 애플리케이션을 다른 macOS 컴퓨터로 옮겨 Qt가 설치되지 않은 상태에서도 실행할 수 있을 것입니다. 또는 번들 외부에 있는 프레임워크를 다른 디렉터리로 옮긴 후, 애플리케이션이 여전히 실행되는지 확인해 볼 수도 있습니다.
프레임워크를 번들 외부의 다른 위치에 저장하는 경우에도 애플리케이션을 링크하는 방법은 비슷합니다. 애플리케이션과 프레임워크가 Qt 라이브러리와 플러그인을 찾을 위치를 일치시켜야 합니다.
애플리케이션 패키지 생성
애플리케이션을 Qt에 정적 링크하거나 프레임워크로 링크하는 작업을 완료하면, 애플리케이션을 배포할 준비가 된 것입니다. 자세한 내용은 Apple 개발자 웹사이트를 참조하십시오.
애플리케이션을 배포하는 과정에는 몇 가지 주의할 점이 있지만, 다양한 문제점을 파악하고 나면 모든 macOS 사용자가 만족할 만한 패키지를 쉽게 만들 수 있습니다.
애플리케이션 종속성
Qt 플러그인
모든 Qt GUI 애플리케이션은 Qt에서 Qt Platform Abstraction (QPA) 계층을 구현하는 플러그인이 필요합니다. macOS의 경우, 플랫폼 플러그인의 이름은 libqcocoa.dylib 입니다. 이 파일은 배포 디렉터리 내의 특정 하위 디렉터리(기본값: platforms)에 위치해야 합니다. 또는 아래에 설명된 대로 Qt가 플러그인을 찾기 위해 사용하는 검색 경로를 조정할 수도 있습니다.
또한 애플리케이션은 JPEG 이미지 형식 플러그인이나 Qt SQL 드라이버 플러그인 등 하나 이상의 Qt 플러그인에 의존할 수 있습니다. 필요한 모든 Qt 플러그인을 애플리케이션과 함께 배포해야 합니다. 플랫폼 플러그인과 마찬가지로, 각 유형의 플러그인은 배포 디렉터리의 특정 하위 디렉터리(예: imageformats 또는 sqldrivers) 내에 위치해야 합니다.
Qt 플러그인에 대한 검색 경로(및 몇 가지 다른 경로)는 QtCore 라이브러리에 하드코딩되어 있습니다. 기본적으로 첫 번째 플러그인 검색 경로는 /path/to/Qt/plugins 로 하드코딩됩니다. 하지만 미리 정해진 경로를 사용하는 데는 몇 가지 단점이 있습니다. 예를 들어, 대상 시스템에 해당 경로가 존재하지 않을 수 있습니다. 따라서 Qt 플러그인이 제대로 검색될 수 있도록 다양한 대안을 확인해야 합니다:
-
qt.conf를 사용합니다. 이 방법은 가장 높은 유연성을 제공하므로 권장되는 접근 방식입니다. - QApplication::addLibraryPath() 또는 QApplication::setLibraryPaths()을 사용합니다.
- 타사 설치 유틸리티를 사용하여 QtCore 라이브러리의 하드코딩된 경로를 변경하는 방법.
'Qt 플러그인 생성 방법' 문서에는 Qt 애플리케이션용 플러그인을 빌드하고 배포할 때 주의해야 할 사항들이 요약되어 있습니다.
추가 라이브러리
otool 를 사용하여 애플리케이션이 어떤 라이브러리에 링크되어 있는지 확인할 수 있습니다. 이 명령을 실행할 때 애플리케이션 경로를 인수로 지정하십시오:
otool -L MyApp.app/Contents/MacOS/MyApp컴파일러 전용 라이브러리를 애플리케이션과 함께 재배포해야 하는 경우는 거의 없습니다. 하지만 macOS에서는 Qt를 다양한 방식으로 구성, 빌드 및 설치할 수 있으므로 애플리케이션을 배포하는 방법도 여러 가지가 있습니다. 일반적으로 배포 방식은 개발 목표에 따라 결정됩니다. 마지막 섹션에서는 애플리케이션을 배포할 때 유의해야 할 몇 가지 사항을 설명합니다.
macOS 배포 도구
macOS 배포 도구는 QTDIR/bin/macdeployqt 에서 확인할 수 있습니다. 이 도구는 Qt 라이브러리를 비공개 프레임워크로 포함하는 배포 가능한 애플리케이션 번들을 생성하는 과정을 자동화하도록 설계되었습니다.
또한 macOS 배포 도구는 다음 규칙에 따라 Qt 플러그인을 배포합니다( -no-plugins 옵션이 사용되지 않는 경우):
- 플랫폼 플러그인은 항상 배포됩니다.
- 플러그인의 디버그 버전은 배포되지 않습니다.
- 디자이너 플러그인은 배포되지 않습니다.
- 이미지 형식 플러그인은 항상 배포되지만, 애플리케이션이 Qt SVG 모듈을 사용하는 경우에만 배포됩니다.
- 아이콘 엔진 플러그인은 항상 배포됩니다.
- 인쇄 지원 플러그인은 항상 배포됩니다.
- 애플리케이션이 Qt SQL 모듈을 사용하는 경우에만 배포됩니다.
- 접근성 플러그인은 항상 배포됩니다.
- 스타일 플러그인은 항상 배포됩니다.
중요: Mac 배포 도구를 사용하지 않기로 선택한경우 , 배포 패키지에 이러한 플러그인이 포함되어 있는지 반드시 확인해야 합니다.
애플리케이션 번들에 타사 라이브러리를 포함시키려면, 번들이 생성된 후 해당 라이브러리를 수동으로 번들에 복사하십시오.
macdeployqt 다음 옵션을 지원합니다:
| 옵션 | 설명 |
|---|---|
-verbose=<0-3> | 0 = 출력 없음, 1 = 오류/경고 (기본값), 2 = 일반, 3 = 디버그 |
-no-plugins | 플러그인 배포 건너뛰기 |
-dmg | .dmg 디스크 이미지 생성 |
-no-strip | 바이너리에 'strip' 명령을 실행하지 않음 |
-use-debug-libs | 프레임워크 및 플러그인의 디버그 버전으로 배포 ( -no-strip 를 암시함) |
-executable=<path> | 지정된 실행 파일도 배포된 프레임워크를 사용하도록 허용 |
-qmldir=<path> | 지정된 경로에 있는 .qml 파일에서 사용하는 임포트 항목 배포 |
-qmlimport=<path> | 지정된 경로를 QML 임포트 검색 위치에 추가하십시오 |
-always-overwrite | 대상 파일이 이미 존재하더라도 파일을 복사하십시오 |
-codesign=<ident> | 모든 실행 파일에 대해 지정된 ID로 codesign 를 실행합니다. 기본적으로 ad-hoc 서명(-codesign=-)이 사용됩니다. |
-no-codesign | 코드 서명을 비활성화합니다 |
-hardened-runtime | 코드 서명 시 강화된 런타임(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권한
서명 시, macdeployqt 는 애플리케이션 번들의 Contents/Resources/ 하위 디렉터리에 .entitlements 파일이 존재할 경우, 해당 디렉터리에서 가장 먼저 발견되는 파일을 자동으로 사용합니다. 오류를 방지하려면 이 폴더에 .entitlements 파일이 최대 하나만 존재하도록 하십시오.
© 2026 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.
