고급 사용법

새로운 구성 기능 추가하기

qmake를 사용하면 CONFIG 변수에 지정된 값 목록에 이름을 추가하여 프로젝트 파일에 포함할 수 있는 자신만의 features 을 만들 수 있습니다. 기능은 여러 표준 디렉터리 중 하나에 있을 수 있는 .prf 파일에 있는 사용자 정의 함수 및 정의의 모음입니다. 이러한 디렉터리의 위치는 여러 곳에 정의되어 있으며, qmake는 .prf 파일을 찾을 때 다음 순서로 각 디렉터리를 확인합니다:

  1. 플랫폼의 경로 목록 구분자(유닉스의 경우 콜론, 윈도우의 경우 세미콜론)로 구분된 디렉터리 목록이 포함된 QMAKEFEATURES 환경 변수에 나열된 디렉터리에서.
  2. QMAKEFEATURES 속성 변수에 나열된 디렉터리로, 플랫폼의 경로 목록 구분 기호로 구분된 디렉터리 목록이 포함되어 있습니다.
  3. mkspecs 디렉터리 내에 있는 기능 디렉터리에서 mkspecs 디렉터리는 플랫폼의 경로 목록 구분 기호로 구분된 디렉터리 목록이 포함된 QMAKEPATH 환경 변수에 나열된 디렉터리 아래에 위치할 수 있습니다. 예: $QMAKEPATH/mkspecs/<features>.
  4. QMAKESPEC 환경 변수에 의해 제공되는 디렉토리 아래에 있는 기능 디렉터리에서. 예: $QMAKESPEC/<features>.
  5. data_install/mkspecs 디렉터리에 있는 기능 디렉터리에 있습니다. 예: data_install/mkspecs/<features>.
  6. QMAKESPEC 환경 변수에 의해 지정된 디렉터리의 형제 디렉터리로 존재하는 기능 디렉터리에 있습니다. 예: $QMAKESPEC/../<features>.

다음 기능 디렉터리에서 기능 파일을 검색합니다:

  1. features/unix, features/win32, 또는 features/macx, 사용 중인 플랫폼에 따라 다릅니다.
  2. features/

예를 들어 프로젝트 파일에 다음과 같은 할당이 있다고 가정해 보겠습니다:

CONFIG += myfeatures

CONFIG 변수를 추가하면 qmake는 프로젝트 파일 구문 분석을 완료한 후 위에 나열된 위치에서 myfeatures.prf 파일을 검색합니다. 유닉스 시스템에서는 다음 파일을 찾습니다:

  1. $QMAKEFEATURES/myfeatures.prf ( QMAKEFEATURES 환경 변수에 나열된 각 디렉토리에 대해)
  2. $$QMAKEFEATURES/myfeatures.prf ( QMAKEFEATURES 속성 변수에 나열된 각 디렉토리에 대해)
  3. myfeatures.prf (프로젝트의 루트 디렉터리에 있음). 프로젝트 루트는 최상위 수준 .pro 파일에 의해 결정됩니다. 그러나 .qmake.cache 파일을 하위 디렉터리 또는 하위 프로젝트의 디렉터리에 배치하면 프로젝트 루트가 하위 디렉터리 자체가 됩니다.
  4. $QMAKEPATH/mkspecs/features/unix/myfeatures.prf$QMAKEPATH/mkspecs/features/myfeatures.prf ( QMAKEPATH 환경 변수에 나열된 각 디렉터리에 대해)
  5. $QMAKESPEC/features/unix/myfeatures.prf$QMAKESPEC/features/myfeatures.prf
  6. data_install/mkspecs/features/unix/myfeatures.prfdata_install/mkspecs/features/myfeatures.prf
  7. $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 (경로 멤버)에 설치되어야 함을 qmake에 알려주고 files 멤버는 설치 디렉터리에 복사해야 할 파일을 지정합니다. 이 경우 docs 디렉터리에 있는 모든 파일이 /usr/local/program/doc 으로 복사됩니다.

설치 세트가 완전히 설명되면 다음과 같은 줄로 설치 목록에 추가할 수 있습니다:

INSTALLS += documentation

qmake는 지정된 파일이 설치 디렉터리에 복사되도록 합니다. 이 프로세스를 더 자세히 제어해야 하는 경우 개체의 extra 멤버에 대한 정의를 제공할 수도 있습니다. 예를 들어, 다음 줄은 이 설치 집합에 대해 일련의 명령을 실행하도록 qmake에 지시합니다:

unix:documentation.extra = create_docs; mv master.doc toc.doc

unix 범위는 이러한 특정 명령이 Unix 플랫폼에서만 실행되도록 합니다. 다른 플랫폼에 적합한 명령은 다른 범위 규칙을 사용하여 정의할 수 있습니다.

extra 멤버에 지정된 명령은 개체의 다른 멤버에 있는 명령이 수행되기 전에 실행됩니다.

INSTALLS 변수에 기본 설치 세트를 추가하고 files 또는 extra 멤버를 지정하지 않으면 qmake가 복사해야 할 항목을 결정합니다. 현재 targetdlltarget 설치 세트가 지원됩니다. 예를 들어

target.path = /usr/local/myprogram
INSTALLS += target

위 줄에서 qmake는 복사해야 할 항목을 알고 설치 프로세스를 자동으로 처리합니다.

사용자 지정 대상 추가하기

qmake는 크로스 플랫폼 빌드 도구에서 예상되는 모든 작업을 수행하려고 합니다. 하지만 플랫폼에 종속된 특수 명령을 실행해야 할 때는 이 방법이 이상적이지 않을 때가 많습니다. 이는 다른 qmake 백엔드에 대한 특정 지침을 사용하여 달성할 수 있습니다.

메이크파일 출력의 사용자 지정은 qmake의 다른 위치에서 볼 수 있는 객체 스타일 API를 통해 수행됩니다. 객체는 멤버를 지정하면 자동으로 정의됩니다. 예를 들어:

mytarget.target = .buildfile
mytarget.commands = touch $$mytarget.target
mytarget.depends = mytarget2

mytarget2.commands = @echo Building $$mytarget.target

위의 정의는 touch 명령으로 생성되는 .buildfile 이라는 Makefile 대상을 포함하는 mytarget 이라는 qmake 대상을 정의합니다. 마지막으로 .depends 멤버는 mytarget 이 이후에 정의되는 또 다른 대상인 mytarget2 에 종속되도록 지정합니다. mytarget2 은 더미 대상입니다. 콘솔에 일부 텍스트를 에코하기 위해서만 정의됩니다.

마지막 단계는 QMAKE_EXTRA_TARGETS 변수를 사용하여 이 오브젝트가 빌드할 대상임을 qmake에 지시하는 것입니다:

QMAKE_EXTRA_TARGETS += mytarget mytarget2

이것이 실제로 사용자 정의 타깃을 빌드하기 위해 필요한 전부입니다. 물론 이러한 타깃 중 하나를 qmake 빌드 타깃에 연결하고 싶을 수도 있습니다. 이렇게 하려면 PRE_TARGETDEPS 목록에 메이크파일 타깃을 포함하기만 하면 됩니다.

사용자 지정 타겟 사양은 다음 멤버를 지원합니다:

멤버설명
명령커스텀 빌드 타깃을 생성하기 위한 명령어입니다.
CONFIG커스텀 빌드 타겟에 대한 특정 구성 옵션입니다. recursive 로 설정하여 하위 타겟 특정 메이크파일 내에서 관련 타겟을 호출하기 위해 메이크파일에 규칙을 생성해야 함을 나타낼 수 있습니다. 이 멤버는 기본적으로 각 하위 대상에 대한 항목을 생성합니다.
depends사용자 지정 빌드 타깃이 종속되는 기존 빌드 타깃입니다.
recurse하위 대상 특정 메이크파일에서 호출하기 위해 메이크파일에서 규칙을 만들 때 사용할 하위 대상을 지정합니다. 이 멤버는 CONFIG 에서 recursive 이 설정된 경우에만 사용됩니다. 일반적인 값은 "Debug" 및 "Release"입니다.
recurse_target메이크파일의 규칙에 대한 하위 대상 메이크파일을 통해 빌드해야 하는 대상을 지정합니다. 이 멤버는 $(MAKE) -f Makefile.[subtarget] [recurse_target] 와 같은 것을 추가합니다. 이 멤버는 CONFIGrecursive 이 설정된 경우에만 사용됩니다.
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 을 실행하여 종속성 정보를 생성하고 이 정보도 프로젝트에 배치합니다.

사용자 정의 컴파일러 사양은 다음 멤버를 지원합니다:

멤버설명
명령입력에서 출력을 생성하는 데 사용되는 명령어입니다.
CONFIG사용자 지정 컴파일러에 대한 특정 구성 옵션입니다. 자세한 내용은 CONFIG 표를 참조하세요.
depend_command출력에 대한 종속성 목록을 생성하는 데 사용되는 명령을 지정합니다.
의존성_유형출력의 파일 유형을 지정합니다. 알려진 유형(예: TYPE_C, TYPE_UI, TYPE_QRC)인 경우 해당 유형의 파일 중 하나로 처리됩니다.
depends출력 파일의 종속성을 지정합니다.
input사용자 정의 컴파일러로 처리할 파일을 지정하는 변수입니다.
name사용자 정의 컴파일러가 수행하는 작업에 대한 설명입니다. 일부 백엔드에서만 사용됩니다.
output사용자 정의 컴파일러에서 생성되는 파일 이름입니다.
output_function생성할 파일명을 지정하는 데 사용되는 사용자 정의 qmake 함수를 지정합니다.
variables여기에 지정된 변수가 프로 파일에서 $(VARNAME)으로 참조될 때 $(QMAKE_COMP_VARNAME)으로 대체됨을 나타냅니다.
variable_out출력에서 생성된 파일이 추가될 변수입니다.

CONFIG 멤버는 다음 옵션을 지원합니다:

옵션설명
결합모든 입력 파일이 하나의 출력 파일로 결합됨을 나타냅니다.
target_predeps출력을 PRE_TARGETDEPS 목록에 추가해야 함을 나타냅니다.
명시적_종속성출력에 대한 종속성은 의존성 멤버에서만 생성되고 다른 곳에서는 생성되지 않습니다.
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는 이를 사용하여 관련 링크 정보를 결정하고, 특히 애플리케이션 프로젝트 파일의 DEFINESLIBS 목록에 값을 추가합니다. 이 파일을 처리한 qmake는 LIBS 변수에서 새로 도입된 라이브러리를 살펴보고 종속된 .prl 파일을 찾아 모든 라이브러리가 해결될 때까지 계속합니다. 이 시점에서 메이크파일은 평소와 같이 생성되고 라이브러리는 애플리케이션에 대해 명시적으로 링크됩니다.

.prl 파일은 플랫폼 종속 정보를 포함할 수 있으므로 qmake로만 만들어야 하며 운영 체제 간에 전송해서는 안 됩니다.

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