상세 컨텐츠

본문 제목

[C++ QT widget] Linux Ubuntu에서 Makefile, qmake, .pro 설명 및 화면 구현하기

QT|QML

by donggyu1998 2021. 6. 14. 16:49

본문

반응형

💡 실행 화면

💡 Makefile 설명입니다. (따라하는건 아래 부분부터있습니다.)

Makefile을 사용하는 이유는 위와 같은 복잡한 과정을 생략할 수 있어서이기도 하지만, Makefile이 제공하는 강력한 기능 중 하나인 Incremental build 를 사용하기 위해서다.

Incremaental build 란?

반복적인 빌드 과정에서 변경된 소스코드에 의존성(Dependency)이 있는 대상들만 추려서 다시 빌드하는 기능이다.
예를 들어, 위의 빌드 예제에서 main.c의 한 줄만 바꾸고 다시 빌드를 할 때, main.o 컴파일(gcc -c -o main.o main.c)과 app.out링크(gcc -o a.out main.o a.o b.o)만 수행하는 경우가 이에 해당한다.

Makefile 은 대상(Target), 의존 관계(Dependency), 명령(Recipe)의 세 가지로 이뤄진다.

<target> : <dependency> (tab)<Recipe>

  • 대상 : 빌드 대상 이름. 명령에 의해 생성되는 결과 파일, 오브젝트 파일이나 실행 파일
  • 의존 관계 : 대상을 만들 때 의존되는 파일들. 여기에 나열된 대상들을 먼저 만들고 빌드 대상을 생성한다. 의존 파일이 변경됐다면 대상을 만들 도록 명령을 내릴 것이다.
  • 명령 : 빌드 대상을 생성하는 명령. 여러 줄로 작성할 수 있으며, 의존 관계에 있는 파일들이 변경됐거나 대상 파일이 없을 때 명령이 실행된다. 쉘에서 쓸 수 있는 명령을 사용할 수 있다.
  • 명령을 쓸 때 반드시 tab키로 띄어준 후에 써야한다.

 

💡 qmake, .pro 설명입니다. (따라하는건 아래 부분부터있습니다.)

qmake는 Makefile generator입니다. qt에서 프로젝트 파일은 확장자가 .pro 파일을 생성하는 데 qmake는 pro파일을 가지고 Makefile을 생성합니다. 윈도우즈 개발 플랫폼에서도 이와 같은 방법으로 프로젝트를 컴파일하는 데 리눅스에서 쓰는 방식 비슷하게 한다는 것이 참으로 인상적입니다.
- SYSTEM - 

 

TEMPLATE : 프로젝트 파일의 타입을 정의합니다. app, vcapp, lib, vclib, subdirs 등이 올 수 있습니다.

app - 독립적인 어플리케이션입니다.(default)

lib - shared lib, static lib

subdirs : 하위 디렉토리를 정의합니다.

HEADERS : 헤더파일을 적습니다.

SOURCE : 소스파일을 적습니다.

TARGET : 실행파일의 이름입니다. 보통 gcc 컴파일 시 -o 옵션 뒤에 붙는 이름이죠. 생략 시, .pro 파일 앞에 붙는 이름이 default값이 됩니다.

DEFINES : 컴파일 시 -D 옵션 뒤에 붙는 옵션입니다.

LIBS : 프로젝트에 링크할 라이브러리를 지정합니다. 절대경로를 사용하거나 -L. -l 과 같이 사용됩니다.

INCLUDEPATH : 전역 헤더 파일의 위치를 찾기위한 경로 지정입니다. -I와 같습니다.

DESTDIR : 실행 이미지가 설치될 디렉토리를 지정합니다. (default값은 리눅스는 현재 디렉토리에 실행파일 생성, 윈도우는 release, debug폴더에 생성)

DEPENDPATH : qmake가 dependency 검색 시 사용되는 경로를 지정

MOC_DIR : 파일이 생성되는 경로 지정

SUBDIRS : 하위 디렉토리에 있는 .pro파일을 재귀적으로 호출될 수 있도록 하위 디렉토리 지정

FORMS : uic에 의해 처리되는 qt 디자이너로 생성된 .ui파일 지정

RESOURCES : rcc에 의해 처리되는 실행파일 내에 포함되는 리소스파일을 저의한 xml파일 .qrc를 지정

VERSION : target 라이브러리의 버전 번호 지정

DLLDESTDIR : dll파일이 설치될 경로 지정 (디폴트는 DESTDIR)

QT : 프로젝트에 사용될 Qt 모듈을 지정한다. 디폴트 값은 Core, Gui이며 이는 QtCore와 QtGui 모듈을 포함한다는 의미다. Qt에 지정되는 모듈은 Core, Gui, Network, OpenGL, SVG, XML, .. 등이 있다.

CONFIG : 다양한 옵션을 제어하기 위해 사용된다. 

💡 코드 따라하기 hello.cpp 생성

#include <QApplication>
#include <QMainWindow>
#include "MyMainWindow.h"

int main(int argc, char *argv[])
{
  QApplication app(argc, argv);
  MyMainWindow window;

  window.setWindowTitle(QString::fromUtf8("MainWindow"));
  window.resize(450,300);
  window.Execute();

  return app.exec();

}

코드 : https://pastebin.com/t7uCB4Dh

💡 코드 따라하기 MyMainWindow.h 생성

#ifndef MYMAINWINDOW_H
#define MYMAINWINDOW_H
#include <QPushButton>
#include <QMessageBox>
#include <QMainWindow>
#include <QVBoxLayout>

class MyMainWindow: public QMainWindow
{
  Q_OBJECT

public:
  MyMainWindow(){}
  ~ MyMainWindow(){}

  void Execute()
  {

    QPushButton *button = new QPushButton(this);
    QPushButton *button2 = new QPushButton(this);

    button->setText("Button No. 1");
    button2->setText("Button No. 2");

    QObject::connect(button, SIGNAL(clicked()),this, SLOT(clickedSlot()));
    QObject::connect(button2, SIGNAL(clicked()),this, SLOT(clickedSlot()));

    button->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    button2->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);

    QWidget* centralWidget = new QWidget(this);
    centralWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);

    QVBoxLayout* layout = new QVBoxLayout(centralWidget);

    layout->addWidget(button);
    layout->addWidget(button2);

    setCentralWidget(centralWidget);
    setWindowTitle("Pushbutton Clicked Signal Test");
    show();
  }

public slots:
  void clickedSlot()
  {
    QMessageBox msgBox;
    msgBox.setWindowTitle("MessageBox Title");
    msgBox.setText("You Clicked "+ ((QPushButton*)sender())->text());
    msgBox.exec();
  }
};
#endif // MYMAINWINDOW_H

코드 : https://pastebin.com/sVFLmtDR

 

💡 터미널 따라하기

[1] qmake -project.pro 파일 생성 후 수정

[2] qmake 진행

.qmake.stash 파일이 생성됩니다.

 

[3] make 진행

오류가 없이 진행되면 ./폴더명 입력해주세요.

그러면 정상적으로 실행됩니다.

반응형

관련글 더보기