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>
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 : 다양한 옵션을 제어하기 위해 사용된다.
#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
#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
[2] qmake 진행
.qmake.stash 파일이 생성됩니다.
[3] make 진행
오류가 없이 진행되면 ./폴더명 입력해주세요.
그러면 정상적으로 실행됩니다.
[C++ QT QML] Signal slot으로 C++에서 QML로 데이터 전송 (0) | 2021.06.15 |
---|---|
[C++ QT QML] Signal slot 활용하여 화면 클릭 시 이벤트 처리 (0) | 2021.06.15 |
[C++ QT QML] Linux Ubuntu에서 Makefile 만들기 버전[2](Windows/Ubuntu) (0) | 2021.06.14 |
[C++ QT QML] Visual Studio Code에서 Makefile 만들기 버전[1](Windows/Ubuntu) (0) | 2021.06.14 |
[C++ QT QML] Signal slot 활용하여 Button 클릭 시 이벤트 처리 (0) | 2021.06.14 |