임베디드 리눅스 개발환경

임베디드 리눅스를 처음 접했을 때 가장 큰 장점으로 생각한 것은 개발의 편리성이었습니다. "Embedded Linux 시스템 개발환경 구축 방법"에서 말씀드린 바와 같이 임베디드에서 실행되는 프로그램을 작성하더라도 모든 작업을 개발용 PC에서 작업할 수 있다는 점이었습니다.

PC에서 만들어진 프로그램을 소스 수정없이 컴파일 한 번으로 임베디드 보드에서 실행되는 것을 매우 인상적으로 보았습니다.

아무래도 PC에서 작업하는 것이 편하죠. 마이컴 보드에 복잡 다단한 케이블을 연결하고 작업하는 모습을 생각해 보십시오. ^^

물론 이부분에 대해서 회의적으로 보시는 분도 계십니다. PC보다 임베디드보드가 느리다 보니까 개발용 PC에서 이상없이 작성된 프로그램이 임베디드 보드로 실행했을 때, 예상 밖의 문제점을 만나게 되고 완성된 프로그램을 다시 손질해야 하는 경우가 있기 때문이죠.

물론 저 같은 경우에도 개발 완료를 임베디드 보드에서 합니다만, 프로젝트를 처음 시작할 때, 임베디드 보드를 연결하여 시작하는 것 보다는 PC에서 확인할 것은 확인해 가면서 큰 몸체를 만들기 시작하는 것이 심적으로 부담이 적다고 생각됩니다.

X11용 Makefile 만들기

QT도 다중 플랫폼을 제공합니다. i386뿐만 아니라 크로스 컴파일러를 설치해 주면 원하는 플랫폼의 프로그램을 작성할 수 있는 장점이 있습니다.

앞서 말씀드린 생각과 경험 때문에 QT 설치를 완료하고 처음 확인한 것이 i386, 즉 PC에서 프로그램을 작성하고, 이후에 큰 작업 없이 어떻게 임베디드용 프로그램을 작성할 수 있는지 그 방법을 확인하는 것이었습니다.

아직 경험이 부족하지만 다른 임베드드 프로그램처럼 간단한 작업으로 PC 프로그램에서 임베디드 프로그램을 만들 수 있고, 다시 테스트를 위해 PC 프로그램을 생성할 수 있었습니다.

설명을 위해 화면에 문자열을 출력하는 간단한 프로그램을 작성했습니다.

#include <qapplication.h>
#include <qlabel.h> 
int main(int argc, char **argv)
{
  QApplication app( argc, argv);
  QLabel *lb= new QLabel( "<font size=5 color=blue>Hello!! <b>Falinux Forum.</b></font>", 0);
  app.setMainWidget(lb);
  lb->show();

  return app.exec();
}

우선 PC에서 실행하는 프로그램으로 컴파일해 보겠습니다. 예전 버전의 QT에서는 progen과 tmake를 이용해서 Makefile을 만들어야 했지만 신규 버전 부터는 qmake로 프로젝트 파일과 Makefile을 만들어 냅니다.

   우선 x11 용으로 프로그램을 컴파일하기 위해서 준비한 환경 파일을 이용하여 컴파일 환경을 설정합니다.

]# source /qt/qtx-2.env

   qmake -project로 프로젝트 파일을 생성합니다.
   -o 옵션을 사용하지 않으면 디렉토리명으로 생성되는데
   -o 옵션으로 적당한 이름의 파일이 생성되도록 지저하는 것이 좋습니다.
   
]# qmake -project -o hello.pro

   qmake를 다시 실행하여 x11용 Makefile을 생성합니다.
   
]# qmake

   Makefile을 생성했으니 컴파일해서 실행파일을 만듭니다.

]# make
g++ -c -pipe -Wall -W -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector
 --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables
  -DQT_NO_DEBUG -I/usr/lib/qt-3.3/mkspecs/default -I. -I. -I/qt/qtx-2/include -o main.o main.cpp
g++  -o hello main.o    -L/qt/qtx-2/lib -lqt-mt -lXext -lX11 -lm
/usr/bin/ld: cannot find -lqt-mt
collect2: ld returned 1 exit status
make: *** [hello] 오류 1

   make 중에 "cannot find -lqt-mt"에러가 발생했습니다. 나름 열심히 QT 개발환경을 설치한다고
   했는데 무엇인가 모자른 부분이 있었나 봅니다. 아직 원인을 모르지만 알게되면 바로 설명을
   올리겠습니다.
   
   이번 시간에는 문제점만 고치고 가겠습니다. 원래는 -lqt-mt가 아니라 -lqt입니다.
   
   그러므로 Makefile에서 -lqt-mt 부분을 -lqt로 수정한 후 다시 make를 실행합니다.

]# vi Makefile

     20 LINK     = g++
21 LFLAGS =
22 LIBS = $(SUBLIBS) -L$(QTDIR)/lib -lqt-mt -lXext -lX11 -lm -> -lqt-mt를 -lqt로 수정
23 AR = ar cqs
]# make g++ -o hello main.o -L/qt/qtx-2/lib -lqt -lXext -lX11 -lm ]./hello -qws

Arm용 Makefile 만들기

PC에서 컴파일하고 실행까지 했습니다. 그럼 이번에는 같은 프로그램을 가지고 Arm용 Makefile을 만들고 컴파일을 해서 실행파일을 만들어 보겠습니다.

   Arm용 임베디드로 작업할 수 있도록 qte-qrm.env로 환경을 설정해 줍니다.

]# source /qt/qte-arm.env

   Arm용 Makefile을 새로 만들어야 합니다. 예로 Makefile 안에 있는 g++을
   arm-linux-g++로 바꾸는 것과 같은 작업을 해 주어야 합니다.

]# qmake -spec $QPEDIR/mkspecs/qws/linux-arm-g++ hello.pro
Project ERROR: Please set a target in /home/jwjw/prjs/qt-study/002-test

   그런데 에러가 발생했군요. 처음에는 target을 지정하라는 말이 무슨 말인지 몰랐습니다.
   한참 헤메다가 qpe-arm에 있는 샘플 pro 파일을 보고 알 수 있었습니다.
   여하튼 머리가 나쁘면 몸이 고생입니다. ^^;

   pro 파일에서 TARGET 옵션을 지정해 줍니다.

]# vi hello.pro
   
      5 TEMPLATE = app
      6 CONFIG -= moc
      7 INCLUDEPATH += .
      8 
      9 # Input
     10 SOURCES += main.cpp
     11 
     12 TARGET  = hello      -> 추가합니다.
	 
   한번 수정해 주면 앞으로 소스 파일 이름을 추가하거나 옵션을 수정하는 것 외에는
   다시 수정할 일은 없습니다.

   이 hello.pro 파일을 가지고 Makefile을 생성합니다.

]# qmake -spec $QPEDIR/mkspecs/qws/linux-arm-g++ hello.pro

   에러없이 생성되었습니다. make를 실행합니다.

]# make
arm-linux-g++ -c -pipe -DQWS -fno-exceptions -fno-rtti -Wall -W -Os  -DQT_NO_QWS_VFB
-DQTOPIA_DATA_LINKING -DQCONFIG="qconfig-qpe.h" -DQTOPIA_TARGET="hello"
-DQTOPIA_TRTARGET="hello" -DQT_NO_DEBUG -I/qt/qpe-arm/mkspecs/qws/linux-arm-g++ -I.
-I. -I/qt/qpe-arm/include -I/qt/qte-arm/include -I.ui/release-shared/
-I.moc/release-shared/ -o .obj/release-shared/main.o main.cpp
arm-linux-g++  -o hello .obj/release-shared/main.o     -L/qt/qpe-arm/lib -L/qt/qte-arm/lib -lqte
]#

이제 임베디드 프로그램을 작성했습니다. 임베디드 보드에서 실행해 보겠습니다.

falinux login: root               임베디드 보드로 로그인하고
~]$ mount -t nfs -o nolock 192.168.10.50:/home/jwjw /mnt/nfs   nfs로 마운트했습니다.
~]$ cd /app/qpe
qpe]$ source ../qpe.env       qpe실행 환경을 설정해 주고
qpe]$ bin/qpe &               qpe를 실행했습니다.
890
qpe]$ Mouse type Auto unsupported
Warning: QSocket::writeBlock: Socket is not open
Warning: Unable to open /usr/share/zoneinfo/zone.tab
Warning: Timezone data must be installed at /usr/share/zoneinfo/
Warning: TimeZone::data Can't create a valid data object for 'America/New_York'
Warning: Need to run firstuse
Warning: language message - en_US
Warning: and its not null
Warning: loading /app/qpe/i18n/en_US/qt.qm
Warning: loading /app/qpe/i18n/en_US/qpe.qm
Warning: loading /app/qpe/i18n/en_US/libqpe.qm
Warning: loading /app/qpe/i18n/en_US/libqtopia.qm
Warning: loading /app/qpe/i18n/en_US/language.qm
Warning: loading /app/qpe/i18n/en_US/timezone.qm
Warning: loading /app/qpe/i18n/en_US/systemtime.qm

qpe]$ cd /mnt/nfs/prjs/qt-study/002-test/
002-test]$ ./hello      이번에 만든 샘플을 실행합니다.

다시 X11 프로그램으로 컴파일

Arm용 프로그램을 만들고 임베디드 보드에서 실행까지 해 보았습니다. 이 상태에서 다시 PC에서 실행하려면 어떻게 해야 할까요? 작업은 간단해서 X11 개발환경으로 설정해 주고 qmake를 실행해 주면 됩니다.

]# make clean            이전 컴파일해서 생성된 파일 삭제
]# source /qt/qtx-2.env  X11 개발 환경으로 변경
]# qmake                 X11용 Makefile을 생성하라
]# vi Makefile

     20 LINK     = g++
     21 LFLAGS   =
     22 LIBS     = $(SUBLIBS) -L$(QTDIR)/lib -lqt-mt -lXext -lX11 -lm    -> -lqt-mt를 -lqt로 수정
     23 AR       = ar cqs

]# make                  make 실행
]# ./hello -qws          X Window에서 프로그램 실행

또 다시 Arm 프로그램으로 컴파일

다시 Arm용 프로그램으로 컴파일해야 한다면 역시 환경과 qmke를 다시 실행시켜 주면 됩니다.

]# make clean              이전 컴파일해서 생성된 파일 삭제
]# source /qt/qte-arm.env  Arm 개발 환경으로 변경
]# qmake -spec $QPEDIR/mkspecs/qws/linux-arm-g++ hello.pro  Arm용 Makefile을 생성하라
]# make                  make 실행

   Arm 보드로 로그인해서...

]$ ./hello               Arm 보드에서 프로그램 실행

결언

즉, 이와 같이 프로그램과 프로젝트 파일, *.pro 파일을 새성한 후에 qmake로 원하는 플랫폼의 Makefile을 만들어서 컴파일해 주면 목적하는 실행 파일을 생성할 수 있습니다.

다음 시간에는 QT Designer를 이용하여 좀더 다양한 모습의 프로그램을 작성해 보도록 하겠습니다.