Table of Contents

QT?!

X 윈도우 프로그래밍을 위한 언어이다. QT로 구현된 가장 유명한 것이 바로 KDE 이다. M$ 기반에서 MFC 나 Visual C, C++ 가 있다면, 리눅스의 X 윈도우 애플리케이션은 GTK 또는 QT 이다. GTK 의 대표적인 GNOME 이 있다.

왜 사용하는가?

QT 에서는 임베디드용 툴체인을 제공한다. 또한 샤프에서 나온 리눅스 기반의 자우르스라는 PDA 에 탑재된 QTOPIA 는 QT 기반의 X 윈도우이다. GTK 역시 제공한다.
물론 PDA 같은 제품에 리눅스를 포팅하지 않는 다면, 굳이 QT 를 고집할 이유는 없다. 하지만, 나 개인적으로 리눅스를 포팅할 것이기 때문에 여기서는 리눅스 기반에서 QT 프로그래밍을 할 수 있는 개발 환경을 구축하는 방법을 설명할 것이다.

준비운동 하기

일단 QT 프로그래밍을 하기위해 필요한 것들이 몇가지 있다.

  1. qt-embedded
  2. qt-x11
  3. tmake

위의 것들이 그것이다. 모두 http://www.trolltech.com 에서 무료로 다운받을 수 있다. 참고로 나의 경우, 최신버전이 아닌 2.3.2(qt-embbed, qt-x11), 1.8(tmake)을 다운로드 받았다. 내가 사용해본 결과, 최신 버전을 받아도 큰 무리는 없을 것 같다. 여기서는 이것을 기준으로 설명하도록 하겠다.

설치하기

차례대로 qt-embedded 부터 설치하도록 한다.

#tar xzvf qt-embedded-2.3.2.tar.gz
#mv qt-embedded-2.3.2 qte-2.3.2
#mv qte-2.3.2 ~/
#cd
#QTDIR=~/qte-2.3.2
#LD_LIBRARY_PATH=~/qte-2.3.2/lib:$LD_LIBRARY_PATH
#export QTDIR LD_LIBRARY_PATH
#cd ~/qte-2.3.2
#./configure

이 후로 몇가지 질문이 나올 것이다. 차례대로 'yes → 5 → 16 → yes' 를 선택한다. 그리고는

#make

컴파일을 한다. 에러없이 컴파일 되었다면, 설치가 성공한 것이다. 이번에는 qt-x11 를 설치해보자.

#tar xzvf qt-x11-2.3.2.tar.gz
#mv qt-2.3.2 qtx-2.3.2
#mv qtx-2.3.2 ~/
#QTDIR=~/qtx-2.3.2
#LD_LIBRARY_PATH=~/qtx-2.3.2/lib:$LD_LIBRARY_PATH
#export QTDIR LD_LIBRARY_PATH
#cd ~/qtx-2.3.2
#./configure

역시 이후에 몇가지 질문이 주어진다. 차례대로, 'yes' 를 선택한다. 그리고 나서,

#make

컴파일을 수행한다. qt 에서 제공하는 프레임버퍼를 사용하기 위해, qvfb 를 별도로 컴파일해주어야 한다.

#cd ~/qtx-2.3.2/tools/qvfb
#make
#./qvfb -width 640 -height 480 -depth 16 &
#cp qvfb ~/qtx-2.3.2/bin

프로그램창이 하나 떳을 것이다. 바로 이것이 QT 프레임버퍼다. 이것은 나중에 내가 만든 QT 프로그램을화면에 띄우는 역할이다.
이번에는 간단한 예제 프로그램을 하나 실행해보도록 하자!

#QTDIR=~/qte-2.3.2
#LD_LIBRARY_PATH=~/qte-2.3.2/lib:$LD_LIBRARY_PATH
#PATH=~/qtx-2.3.2/bin:$PATH
#export QTDIR LD_LIBRARY_PATH PATH
#qvfb -width 640 -height 480 -depth 16 &
#cd $QTDIR
#cd examples/launcher
#./launcher -qws

앞에서 만든 QT 프레임버퍼 창에 뭔가가 떳을 것이다. 위에서는 실제로 launcher 라는 예제 프로그램을 실행했다. 이제 좀 감이 잡혔을 것이다. 컴파일을 해서 실행파일을 만들면, 이런식으로 직접 실행해 볼 수 있다.

이제는 마지막으로 tmake 를 설치하자. make 와 흡사하다고 생각하면 된다. 나중에 내가 프로그래밍을 직접 컴파일 할 때 유용하게 사용될 것이다.

#tar xzvf tmake-1.8.tar.gz
#mv tmake-1.8 ~/

컴파일 필요없이 압축만 풀어주면 끝난다. tmake 를 이용해서 간단히 사용법을 알아보자.

#TMAKEPATH=~/tmake-1.8/qws/linux-x86-g++
#PATH=$PATH:~/tmake-1.8/bin
#export TMAKEPATH PATH
#cd ~/tmake-1.8/example
#vi hello.pro

제공되는 예제 디렉토리에 가보면, 프로젝트 파일(.pro) 이 있다. 컴파일을 하기 위해서는 프로젝트 파일을 생성해야만 한다. 물론 여기서는 예제이기 때문에 내가 만들지 않아도, 이미 만들어져 있다. 어떤 식으로 만들어져 있는 지 살펴보자!!

TEMPLATE    = app
CONFIG      = qt warn_on release
HEADERS     = hello.h
SOURCES     = hello.cpp \
          main.cpp
TARGET      = hello

얼핏 보면, Makefile 의 구조와 비슷하다. 프로젝트 파일은 Makefile 을 만드는 데 필요하다. 후에 컴파일을 위해서는 Makefile 이 필요하기 때문이다.

#cd ~/tmake-1.8/example
#tmake hello.pro -o Makefile

위와 같이 실행했으면, 결과로 Makefile 이 생성되었을 것이다. 지금은 사용법을 익히는 과정이기 때문에, Makefile 을 살펴보자!

#############################################################################
# Makefile for building hello
# Generated by tmake at 00:56, 2004/12/05
#     Project: hello
#    Template: app
#############################################################################
 
####### Compiler, tools and options
 
CC  =   gcc
CXX =   g++
CFLAGS  =   -pipe -Wall -W -O2 -fno-default-inline -DNO_DEBUG
CXXFLAGS=   -pipe -DQWS -fno-exceptions -fno-rtti -Wall -W -O2 -fno-default-inline -DNO_DEBUG
INCPATH =   -I$(QTDIR)/include
LINK    =   g++
LFLAGS  =
LIBS    =   $(SUBLIBS) -L$(QTDIR)/lib -lqte
MOC =   $(QTDIR)/bin/moc
UIC =   $(QTDIR)/bin/uic
 
TAR =   tar -cf
GZIP    =   gzip -9f
 
####### Files
 
HEADERS =   hello.h
SOURCES =   hello.cpp \
        main.cpp
OBJECTS =   hello.o \
        main.o
INTERFACES =
UICDECLS =
UICIMPLS =
SRCMOC  =   moc_hello.cpp
OBJMOC  =   moc_hello.o
DIST    =
TARGET  =   hello
INTERFACE_DECL_PATH = .
 
####### Implicit rules
 
.SUFFIXES: .cpp .cxx .cc .C .c
 
.cpp.o:
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
 
.cxx.o:
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
 
.cc.o:
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
 
.C.o:
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
 
.c.o:
    $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
 
####### Build rules
 
 
all: $(TARGET)
 
$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC)
    $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)
 
moc: $(SRCMOC)
 
tmake: Makefile
 
Makefile: hello.pro
    tmake hello.pro -o Makefile
 
dist:
    $(TAR) hello.tar hello.pro $(SOURCES) $(HEADERS) $(INTERFACES) $(DIST)
    $(GZIP) hello.tar
 
clean:
    -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS) $(TARGET)
    -rm -f *~ core
 
####### Sub-libraries
 
###### Combined headers
 
 
####### Compile
 
hello.o: hello.cpp \
        hello.h
 
main.o: main.cpp \
        hello.h
 
moc_hello.o: moc_hello.cpp \
        hello.h
 
moc_hello.cpp: hello.h
    $(MOC) hello.h -o moc_hello.cpp

보면, tmake 프로그램이 프로젝트 파일을 Makefile 로 변환해주는 역할을 한다는 것을 알 수 있다.
이제 직접 컴파일을 해보자.

#make

에러없이 수행되었다면, hello 라는 실행파일이 생성되었을 것이다. 여기서 궁금한 것이 있을 것이다. 프로젝트 파일을 어떻게 만드는 가? 이다. 역시 tmake 에서 제공하는 progen 이라는 프로그램을 이용해서 간단히 만들 수 있다.

#cd ~/tmake-1.8/bin
#./progen -o hello.pro hello.h hello.cpp main.cpp

progen 다음에 프로젝트에 포함될 파일들을 나열해주면 된다. 좀 더 간편한 방법도 있다. 현재 디렉토리의 모든 헤더 파일과 소스파일을 프로젝트 파일로 넣는다면, 다음과 같이 하면 된다.

#progen -o hello.pro

마치며

리눅스 기반에서 QT 개발 환경을 만들었다. 본격적인 프로그래밍과 컴파일 방법은 다른 문서에서 다루기로 한다.
설치하면서, 가장 중요한 것이 바로 환경변수 설정이다. 반드시 설치하기 전이나 프로그램을 실행할 때,

#env

로 환경변수가 제대로 잡혀 있는지 확인하기 바란다. 그렇지 않으면, 원하는 결과가 나오지 않을 수 있다.