고급 사용법
새로운 구성 기능 추가
qmake를 사용하면 CONFIG 변수가 지정한 값 목록에 이름을 추가함으로써 프로젝트 파일에 포함될 수 있는 사용자 정의 구성 기능( features )을 생성할 수 있습니다. 기능은 .prf 파일에 포함된 사용자 정의 함수와 정의의 모음이며, 이러한 파일은 여러 표준 디렉터리 중 하나에 위치할 수 있습니다. 이러한 디렉터리의 위치는 여러 곳에서 정의되며, qmake는 ` .prf ` 파일을 찾을 때 다음 순서대로 각 위치를 확인합니다:
QMAKEFEATURES환경 변수에 나열된 디렉터리 중, 플랫폼의 경로 목록 구분자(Unix의 경우 콜론, Windows의 경우 세미콜론)로 구분된 디렉터리 목록이 포함된 디렉터리.QMAKEFEATURES속성 변수에 나열된 디렉터리 중, 플랫폼의 경로 목록 구분 기호(Unix의 경우 콜론, Windows의 경우 세미콜론)로 구분된 디렉터리 목록이 포함된 디렉터리.mkspecs디렉터리 내에 위치한 features 디렉터리.mkspecs디렉터리는 플랫폼의 경로 목록 구분 기호로 구분된 디렉터리 목록을 포함하는QMAKEPATH환경 변수에 나열된 디렉터리 중 어느 곳 아래에나 위치할 수 있습니다. 예:$QMAKEPATH/mkspecs/<features>.- QMAKESPEC 환경 변수가 지정한 디렉터리 아래에 위치한 features 디렉터리 내. 예:
$QMAKESPEC/<features>. data_install/mkspecs디렉터리 내에 위치한 features 디렉터리. 예:data_install/mkspecs/<features>.QMAKESPEC환경 변수로 지정된 디렉터리와 같은 수준에 위치한 features 디렉터리 내. 예:$QMAKESPEC/../<features>.
다음 features 디렉터리에서 features 파일을 검색합니다:
features/unix사용 중인 플랫폼에 따라features/win32또는features/macxfeatures/
예를 들어, 프로젝트 파일에서 다음과 같은 할당을 고려해 보십시오:
CONFIG += myfeaturesCONFIG 변수에 이 설정을 추가하면, qmake는 프로젝트 파일 구문 분석을 마친 후 위에 나열된 위치에서 myfeatures.prf 파일을 검색합니다. 유닉스 시스템에서는 다음 파일을 찾게 됩니다:
$QMAKEFEATURES/myfeatures.prf(QMAKEFEATURES환경 변수에 나열된 각 디렉터리마다)$$QMAKEFEATURES/myfeatures.prf(QMAKEFEATURES속성 변수에 나열된 각 디렉터리마다)myfeatures.prf(프로젝트의 루트 디렉터리 내). 프로젝트 루트는 최상위.pro파일로 결정됩니다. 그러나.qmake.cache파일을 하위 디렉터리나 하위 프로젝트의 디렉터리에 배치하면, 프로젝트 루트는 해당 하위 디렉터리 자체가 됩니다.$QMAKEPATH/mkspecs/features/unix/myfeatures.prf그리고$QMAKEPATH/mkspecs/features/myfeatures.prf(QMAKEPATH환경 변수에 나열된 각 디렉터리에 대해)$QMAKESPEC/features/unix/myfeatures.prf그리고$QMAKESPEC/features/myfeatures.prfdata_install/mkspecs/features/unix/myfeatures.prf그리고data_install/mkspecs/features/myfeatures.prf$QMAKESPEC/../features/unix/myfeatures.prf그리고$QMAKESPEC/../features/myfeatures.prf
참고: .prf 파일의 이름은 소문자로 지정해야 합니다.
파일 설치
유닉스 환경에서는 빌드 도구를 사용하여 애플리케이션과 라이브러리를 설치하는 것이 일반적입니다. 예를 들어, ` make install` 명령을 실행하는 방식이 있습니다. 이러한 이유로, qmake에는 ` install set`라는 개념이 있는데, 이는 프로젝트의 특정 부분이 어떻게 설치되어야 하는지에 대한 지침을 포함하는 객체입니다. 예를 들어, 문서 파일 모음은 다음과 같이 정의할 수 있습니다:
documentation.path = /usr/local/program/doc
documentation.files = docs/*path 멤버는 해당 파일들이 /usr/local/program/doc (path 멤버)에 설치되어야 함을 qmake에 알리며, files 멤버는 설치 디렉터리로 복사되어야 할 파일을 지정합니다. 이 경우, docs 디렉터리에 있는 모든 파일이 /usr/local/program/doc 로 복사됩니다.
설치 세트가 완전히 정의되면 다음과 같은 줄을 사용하여 설치 목록에 추가할 수 있습니다:
INSTALLS += documentationqmake는 지정된 파일들이 설치 디렉터리로 복사되도록 보장합니다. 이 과정을 더 세밀하게 제어해야 하는 경우, 객체의 extra 멤버에 대한 정의를 제공할 수도 있습니다. 예를 들어, 다음 줄은 qmake에게 이 설치 세트에 대해 일련의 명령을 실행하도록 지시합니다:
unix:documentation.extra = create_docs; mv master.doc toc.docunix 범위는 이러한 특정 명령이 유닉스 플랫폼에서만 실행되도록 보장합니다. 다른 플랫폼에 적합한 명령은 다른 범위 규칙을 사용하여 정의할 수 있습니다.
extra 멤버에 지정된 명령은 해당 객체의 다른 멤버에 있는 지시문이 실행되기 전에 먼저 실행됩니다.
INSTALLS 변수에 내장된 설치 세트를 추가하고 files 또는 extra 멤버를 지정하지 않으면, qmake가 복사해야 할 항목을 자동으로 결정합니다. 현재 target 및 dlltarget 설치 세트가 지원됩니다. 예를 들어:
target.path = /usr/local/myprogram
INSTALLS += target위의 코드에서 qmake는 복사해야 할 항목을 파악하고, 설치 과정을 자동으로 처리합니다.
사용자 정의 타겟 추가
qmake는 크로스 플랫폼 빌드 도구로서 기대되는 모든 기능을 수행하려고 합니다. 하지만 특정 플랫폼에 의존적인 명령을 반드시 실행해야 하는 경우에는 이 방식이 이상적이지 않은 경우가 종종 있습니다. 이러한 경우, 다양한 qmake 백엔드에 대한 구체적인 지시를 통해 해결할 수 있습니다.
Makefile 출력의 사용자 정의는 qmake의 다른 부분에서 볼 수 있는 객체 스타일 API를 통해 수행됩니다. 객체는 멤버를 지정함으로써 자동으로 정의됩니다. 예를 들어:
mytarget.target = .buildfile
mytarget.commands = touch $$mytarget.target
mytarget.depends = mytarget2
mytarget2.commands = @echo Building $$mytarget.target위의 정의는 ` mytarget`라는 qmake 타깃을 정의하며, 이 타깃은 ` .buildfile `라는 Makefile 타깃을 포함하고, 이 타깃은 ` touch ` 명령어로 생성됩니다. 마지막으로, ` .depends ` 멤버는 ` mytarget `가 나중에 정의될 또 다른 타깃인 ` mytarget2`에 의존함을 지정합니다. ` mytarget2 `는 더미 타깃입니다. 이 타깃은 콘솔에 일부 텍스트를 출력하기 위해서만 정의되었습니다.
마지막 단계는 QMAKE_EXTRA_TARGETS 변수를 사용하여 qmake에 이 객체가 빌드해야 할 타깃임을 지시하는 것입니다:
QMAKE_EXTRA_TARGETS += mytarget mytarget2사용자 정의 타깃을 실제로 빌드하기 위해 필요한 작업은 이것뿐입니다. 물론, 이러한 타깃 중 하나를 qmake 빌드 타깃에 연결하고 싶을 수도 있습니다. 이를 위해서는 PRE_TARGETDEPS 목록에 해당 Makefile 타깃을 포함시키기만 하면 됩니다.
사용자 정의 타겟 사양은 다음 구성 요소를 지원합니다:
| 구성 요소 | 설명 |
|---|---|
| commands | 사용자 정의 빌드 타깃을 생성하기 위한 명령어입니다. |
| CONFIG | 사용자 정의 빌드 타깃에 대한 구체적인 구성 옵션입니다. ` recursive `로 설정하면, 서브 타깃별 Makefile 내에서 관련 타깃을 호출하는 규칙이 Makefile에 생성되어야 함을 나타낼 수 있습니다. 이 멤버의 기본값은 각 서브 타깃에 대한 항목을 생성하는 것입니다. |
| depends | 사용자 정의 빌드 타깃이 의존하는 기존 빌드 타깃입니다. |
| recurse | 서브 타겟별 Makefile 내에서 호출할 규칙을 Makefile에 생성할 때 사용할 서브 타겟을 지정합니다. 이 멤버는 ` CONFIG`에서 ` recursive `가 설정된 경우에만 사용됩니다. 일반적인 값으로는 "Debug"와 "Release"가 있습니다. |
| recurse_target | Makefile 내의 규칙에 대해 하위 타깃 Makefile을 통해 빌드해야 할 타깃을 지정합니다. 이 멤버는 $(MAKE) -f Makefile.[subtarget] [recurse_target] 와 유사한 내용을 추가합니다. 이 멤버는 CONFIG 에서 recursive 가 설정된 경우에만 사용됩니다. |
| target | 사용자 정의 빌드 타깃의 이름입니다. |
컴파일러 추가
새로운 컴파일러와 전처리기를 지원하도록 qmake를 사용자 정의할 수 있습니다:
new_moc.output = moc_${QMAKE_FILE_BASE}.cpp
new_moc.commands = moc ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT}
new_moc.depend_command = g++ -E -M ${QMAKE_FILE_NAME} | sed "s,^.*: ,,"
new_moc.input = NEW_HEADERS
QMAKE_EXTRA_COMPILERS += new_moc위의 정의들을 사용하면, moc의 대체 프로그램이 있다면 이를 바로 사용할 수 있습니다. 이 명령은 NEW_HEADERS 변수( input 멤버에서 지정됨)에 전달된 모든 인자에 대해 실행되며, 그 결과는 output 멤버에서 정의된 파일에 기록됩니다. 이 파일은 프로젝트의 다른 소스 파일들에 추가됩니다. 또한, qmake는 depend_command 를 실행하여 종속성 정보를 생성하고, 이 정보도 프로젝트에 포함시킵니다.
사용자 정의 컴파일러 사양은 다음 멤버를 지원합니다:
| 멤버 | 설명 |
|---|---|
| commands | 입력값으로부터 출력을 생성하는 데 사용되는 명령어입니다. |
| CONFIG | 사용자 정의 컴파일러에 대한 특정 구성 옵션입니다. 자세한 내용은 CONFIG 표를 참조하십시오. |
| depend_command | 출력에 대한 종속성 목록을 생성하는 데 사용되는 명령을 지정합니다. |
| dependency_type | 출력 파일의 유형을 지정합니다. 알려진 유형(예: TYPE_C, TYPE_UI, TYPE_QRC)인 경우, 해당 유형의 파일 중 하나로 처리됩니다. |
| depends | 출력 파일의 종속성을 지정합니다. |
| input | 사용자 정의 컴파일러로 처리해야 할 파일을 지정하는 변수입니다. |
| name | 사용자 정의 컴파일러가 수행하는 작업에 대한 설명입니다. 이는 일부 백엔드에서만 사용됩니다. |
| output | 사용자 정의 컴파일러를 통해 생성되는 파일 이름입니다. |
| output_function | 생성될 파일 이름을 지정하는 데 사용되는 사용자 정의 qmake 함수를 지정합니다. |
| 변수 | 여기에 지정된 변수는 pro 파일에서 $(VARNAME)으로 참조될 때 $(QMAKE_COMP_VARNAME)으로 대체됨을 나타냅니다. |
| variable_out | 출력을 통해 생성된 파일이 추가되어야 할 변수입니다. |
CONFIG 멤버는 다음 옵션을 지원합니다:
| 옵션 | 설명 |
|---|---|
| combine | 모든 입력 파일을 단일 출력 파일로 병합함을 나타냅니다. |
| target_predeps | 출력을 PRE_TARGETDEPS 목록에 추가해야 함을 나타냅니다. |
| explicit_dependencies | 출력에 대한 종속성은 depends 멤버에서만 생성되며, 그 외 다른 곳에서는 생성되지 않습니다. |
| dep_existing_only | .depend_command의 결과인 모든 종속성에 대해 존재 여부를 확인합니다. 존재하지 않는 종속성은 무시됩니다. 이 값은 Qt 5.13.2에서 도입되었습니다. |
| dep_lines | .depend_command의 출력은 한 줄당 하나의 파일로 해석됩니다. 기본값은 공백을 기준으로 분할하는 것이며, 이는 하위 호환성을 위해 유지되고 있습니다. |
| no_link | 출력을 링크 대상 객체 목록에 추가하지 않아야 함을 나타냅니다. |
라이브러리 의존성
라이브러리를 링크할 때, qmake는 대개 이 라이브러리가 어떤 다른 라이브러리와 링크되어 있는지 파악하기 위해 기반 플랫폼에 의존하며, 플랫폼이 해당 라이브러리를 불러오도록 합니다. 그러나 많은 경우, 이것만으로는 충분하지 않습니다. 예를 들어, 라이브러리를 정적으로 링크할 때는 다른 라이브러리와 링크되지 않으므로, 해당 라이브러리에 대한 의존성도 생성되지 않습니다. 하지만 나중에 이 라이브러리에 링크하는 애플리케이션은 정적 라이브러리가 필요로 하는 심볼을 어디서 찾을 수 있는지 알아야 합니다. qmake는 사용자가 추적 기능을 명시적으로 활성화한 경우, 적절한 상황에서 라이브러리의 의존성을 추적하려고 시도합니다.
첫 번째 단계는 라이브러리 자체에서 의존성 추적을 활성화하는 것입니다. 이를 위해서는 qmake에 라이브러리에 대한 정보를 저장하도록 지시해야 합니다:
CONFIG += create_prl이는 lib 템플릿에만 해당되며, 다른 모든 템플릿에서는 무시됩니다. 이 옵션이 활성화되면 qmake는 라이브러리에 대한 메타 정보를 저장하는 .prl 확장자를 가진 파일을 생성합니다. 이 메타 파일은 일반 프로젝트 파일과 유사하지만, 내부 변수 선언만 포함합니다. 이 라이브러리를 설치할 때, INSTALLS 선언에서 해당 라이브러리를 타깃으로 지정하면 qmake는 .prl 파일을 설치 경로로 자동으로 복사합니다.
이 과정의 두 번째 단계는 정적 라이브러리를 사용하는 애플리케이션에서 이 메타 정보를 읽을 수 있도록 설정하는 것입니다:
CONFIG += link_prl이 기능이 활성화되면, qmake는 애플리케이션에 링크된 모든 라이브러리를 처리하여 해당 메타정보를 찾아냅니다. qmake는 이를 활용하여 관련 링크 정보를 결정하며, 특히 애플리케이션 프로젝트 파일의 DEFINES 및 LIBS 목록에 값을 추가합니다. qmake가 이 파일을 처리하면, ` LIBS ` 변수에 새로 추가된 라이브러리를 검토하여 해당 라이브러리에 종속된 .prl 파일을 찾아내며, 모든 라이브러리가 해결될 때까지 이 과정을 반복합니다. 이 시점에서 Makefile은 평소와 같이 생성되며, 라이브러리는 애플리케이션에 명시적으로 링크됩니다.
.prl 파일은 qmake에 의해서만 생성되어야 하며, 플랫폼에 종속적인 정보를 포함할 수 있으므로 운영 체제 간에 전송해서는 안 됩니다.
© 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.