X 윈도우 프로그래밍을 위한 언어이다. QT로 구현된 가장 유명한 것이 바로 KDE 이다. M$ 기반에서 MFC 나 Visual C, C++ 가 있다면, 리눅스의 X 윈도우 애플리케이션은 GTK 또는 QT 이다. GTK 의 대표적인 GNOME 이 있다.
QT 에서는 임베디드용 툴체인을 제공한다. 또한 샤프에서 나온 리눅스 기반의 자우르스라는 PDA 에 탑재된 QTOPIA 는 QT 기반의 X 윈도우이다. GTK 역시 제공한다.
물론 PDA 같은 제품에 리눅스를 포팅하지 않는 다면, 굳이 QT 를 고집할 이유는 없다. 하지만, 나 개인적으로 리눅스를 포팅할 것이기 때문에 여기서는 리눅스 기반에서 QT 프로그래밍을 할 수 있는 개발 환경을 구축하는 방법을 설명할 것이다.
일단 QT 프로그래밍을 하기위해 필요한 것들이 몇가지 있다.
위의 것들이 그것이다. 모두 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
로 환경변수가 제대로 잡혀 있는지 확인하기 바란다. 그렇지 않으면, 원하는 결과가 나오지 않을 수 있다.