본문 바로가기

Qt/qmake

MinGW 빌드 용 qmake 프로젝트 생성


응용 프로그램을 구성하는 세 개의 파일로 시작해 보자.

이 파일들은 [Qt 설치 폴더]/Examples/Qt-6.5.0/qmake/tutorial 폴더에서 가져왔다. 이 파일들에는 푸시 버튼 하나가 포함된 작은 윈도우를 하나 만드는 코드가 포함되어 있다.

이 파일들로부터 실행 파일을 생성하는 과정을 알아보자. VS Code(혹은 아무 텍스트 편집기)로 hello.pro 파일을 만들고 위 세 개 파일과 같은 경로에 저장하자.

프로젝트 파일에 제일 먼저 추가해야 하는 것은 qmake에게 사용할 Qt 모듈을 알려주는 것이다. Qt 모듈을 추가하기 위해 QT 변수를 사용한다[각주:1]. 푸시 버튼을 사용하려면 widgets 모듈을 추가해야 한다.

QT += widgets

추가해야 하는 모듈은 사용하려는 Qt 클래스의 문서에 나와있다. 예를 들어, 이번에 사용한 QPushButton 클래스의 문서를 보면 소스 코드에 포함해야 하는 헤더 파일, CMake를 사용할 때 추가해야 하는 패키지와 라이브러리, qmake를 사용할 때 추가해야 하는 모듈 등의 정보가 페이지 제일 처음에 나와있다.

그 다음으로 해야 할 것은 소스 파일과 헤더 파일 목록을 추가하는 것이다. 소스 파일을 추가하기 위해 SOURCES 변수를 사용한다.

SOURCES += hello.cpp
SOURCES += main.cpp

혹은 '\'와 함께 SOURCES 변수를 한 번만 쓸 수도 있다[각주:2].

SOURCES += hello.cpp \
           main.cpp

이제 HEADERS 변수를 이용해서 헤더 파일을 추가하자. 방식은 동일하다.

HEADERS += hello.h

타겟 파일의 이름은 프로젝트 파일과 같은 이름으로 자동 설정되지만 이름을 변경하고 싶다면 TARGET 변수를 사용하자.

TARGET = helloworld

완성된 프로젝트 파일의 내용은 다음과 같다.

이제 qmake를 사용해 Makefile을 생성해 보자. 명령 창에서 qmake를 실행시켜야 하는데, 윈도우 명령 창에서 실행시키려면 환경 변수를 등록해야 한다. 환경 변수를 등록하지 않고 하려면 Qt 설치 시 함께 설치되는 컴파일러 전용 명령 창에서 실행시키면 된다.

MinGW 전용 명령 창을 실행시키고 프로젝트 파일이 있는 경로로 이동하자.

-o 옵션으로 qmake를 실행시키자. 더 많은 옵션은 Running qmake를 참조하자.

qmake -o Makefile hello.pro

프로젝트 폴더에 Makefile이 생성된 것을 확인할 수 있다.

이 상태에서 명령 창에 mingw32-make를 입력하면 release 폴더에 helloworld.exe 파일이 생성된다.

명령 창에서 현재 경로를 release 폴더로 이동한 후 helloworld.exe를 입력하면 위에서 봤던 Hello world! 푸시 버튼이 있는 윈도우가 뜬다.

그런데, 명령 창이 아닌 탐색기에서 실행시키면 시스템 오류 창이 여러 번 뜨면서 실행이 되지 않는다.

실행에 필요한 dll 파일이 실행 파일과 같은 폴더에 없어서 생기는 오류인데, windeployqt라는 도구를 써서 실행에 필요한 dll 파일을 실행 파일이 있는 폴더로 복사하면 해결된다[각주:3]. 자세한 내용은 Qt for Windows - Deployment를 참조하자.

디버깅 정보를 포함하는 응용 프로그램 만들기

디버깅 정보를 포함하는 실행 파일을 생성하려면 CONFIG 변수에 debug를 추가하자.

CONFIG += debug

qmake로 생성된 파일/폴더를 삭제하고 다시 qmake, mingw32-make를 실행시키면 debug 폴더에 실행 파일이 생성된다.

플랫폼 별로 다른 소스 파일 추가하기

운영체제나 컴파일러 별로 다른 프로젝트를 구성하고 싶다면 플랫폼 scope value를 사용하자. 예를 들어 윈도우 용 소스 파일 hellowin.cpp와 유닉스 용 소스 파일 hellounix.cpp가 있다면 win32, unix라는 scope value를 사용해서 플랫폼에 적합한 소스 파일을 프로젝트에 추가할 수 있다.

win32 {
    SOURCES += hellowin.cpp
}
unix {
    SOURCES += hellounix.cpp
}

일반적으로 win32, macx, unix가 많이 쓰이는데, 그 외에도 운영체제와 컴파일러에 따라 다양한 값들이 있다. 이 값들은 [Qt 설치 폴더]/6.5.0/[컴파일러]/mkspecs 폴더에 각 값들의 이름으로 된 하위 폴더에 정의되어 있다.

각 하위 폴더에 qmake.conf 파일을 열어보면 대상 컴파일러에 대한 정보가 파일 주석의 형태로 명시되어 있다.

지정된 파일이 없을 때 qmake 정지시키기

exists() 함수를 이용해 어떤 파일의 존재 여부를 확인할 수 있고 error() 함수를 이용해 qmake를 멈출 수 있다[각주:4]. 문법은 scope value를 사용하는 것과 동일하다. 만약 main.cpp의 존재 여부를 확인하고 싶다면 다음과 같이 작성할 수 있다.

!exists( main.cpp ) {
    error( "No main.cpp file found" )
}

여러 조건 검사하기

qDebug()를 이용해 디버그 메시지를 명령 창에 출력하고 싶다면 CONFIG 변수에 console을 추가하면 된다. 만약 이 프로그램이 윈도우에서 디버그 모드로 빌드 될 때에만 그런 식으로 작동하도록 프로젝트를 구성하고 싶다면 win32와 debug를 중첩하면 된다.

win32 {
    debug {
        CONFIG += console
    }
}

중첩된 scope value는 콜론으로 연결할 수 있다. 따라서 위의 문장과 아래 문장은 완벽히 같은 문장이다.

win32:debug {
    CONFIG += console
}

  1. 더 많은 변수는 Variables를 참조하자 [본문으로]
  2. Qt Creator에서 프로젝트를 생성하면 프로젝트 파일이 이런 형식으로 작성됨 [본문으로]
  3. 혹은 Qt 설치 폴더에서 해당 dll을 일일이 찾아 복사하는 방법도 있다 [본문으로]
  4. 더 많은 내장 함수에 대해서는 Test Functions를 참조하자. [본문으로]

'Qt > qmake' 카테고리의 다른 글

qmake 개요  (0) 2023.12.25