QTopia를 설치했기 때문에 QT/Embedded에 있는 샘플을 Embedded 보드에서 실행해 보고 싶었습니다. 그러나 make 를 실행하면 아래와 같은 에러가 발생하더군요. 호~ 이것은 무슨 에러지? 처음 보는 것이라 황당했습니다.

]# make
arm-linux-g++ -c -I/qt/qte-arm/include -pipe -DQWS -fno-exceptions -fno-rtti -O2 -Wall -W -DNO_DEBUG -o hello.o hello.cpp
arm-linux-g++ -c -I/qt/qte-arm/include -pipe -DQWS -fno-exceptions -fno-rtti -O2 -Wall -W -DNO_DEBUG -o main.o main.cpp
/qt/qte-arm/bin/moc hello.h -o moc_hello.cpp
arm-linux-g++ -c -I/qt/qte-arm/include -pipe -DQWS -fno-exceptions -fno-rtti -O2 -Wall -W -DNO_DEBUG -o moc_hello.o moc_hello.cpp
arm-linux-gcc -L/qt/qte-arm/lib -Wl,-rpath,/qt/qte-arm/lib -o ./hello hello.o main.o moc_hello.o -lqte -lm
hello.o(.text+0x44): In function `Hello::Hello(char const*, QWidget*, char const*)':
: undefined reference to `operator new(unsigned int)'
hello.o(.text+0xe0): In function `Hello::Hello(char const*, QWidget*, char const*)':
: undefined reference to `operator new(unsigned int)'
moc_hello.o(.gnu.linkonce.t._ZN5HelloD0Ev+0x64): In function `Hello::~Hello()':
: undefined reference to `operator delete(void*)'
/qt/qte-arm/lib/libqte.so: undefined reference to `operator new[](unsigned int)'
/qt/qte-arm/lib/libqte.so: undefined reference to `__cxa_pure_virtual'
/qt/qte-arm/lib/libqte.so: undefined reference to `operator delete[](void*)'
collect2: ld returned 1 exit status
make: *** [hello] 오류 1
[root@jwCentOS hello2]#

뭐, 황당한 경우가 한두 번도 아니고 또 뭔가 잘못했으니까 안되겠다 싶어서 문제점을 찾아 봤습니다. 이런! 아무리 linux-arm-g++로 QT/Embedded로 설치했다고 해서 샘플이 바로 arm-linux-g++이나 arm-linux-gcc로 컴파일되는 것이 아니군요.

해결 방법 qmake로 pro 파일을 linux-arm-g++로 생성해 주어야 합니다.

즉, 아래와 같이 qmake로 pro 파일을 만듭니다. 원 소스는 나중에 다시 참고해야 하므로 복사해서 사용해 보도록 하겠습니다.

]# cp -r hello hello2
]# cd hello2
]# qmake -spec $QPEDIR/mkspecs/qws/linux-arm-g++ hello.pro
]# 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../../../qpe-arm/include -I../../include -I.ui/release-shared/
-I.moc/release-shared/ -o .obj/release-shared/hello.o hello.cpp
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../../../qpe-arm/include -I../../include -I.ui/release-shared/
-I.moc/release-shared/ -o .obj/release-shared/main.o main.cpp
/qt/qte-arm/bin/moc hello.h -o .moc/release-shared/moc_hello.cpp
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../../../qpe-arm/include
-I../../include -I.ui/release-shared/ -I.moc/release-shared/ -o .obj/release-shared/moc_hello.o
.moc/release-shared/moc_hello.cpp
arm-linux-g++ -o hello .obj/release-shared/hello.o .obj/release-shared/main.o
.obj/release-shared/moc_hello.o -L/qt/qpe-arm/lib -L/qt/qte-arm/lib -lqte
]# 이제 임베디드 보드에 복사해서 실행해 보겠습니다. qtopia 프로그램을 실행하기 위해서는 qpe 프로그램이 설치되어 있어야 하며, 이 방법은 이미 이전 시간 QTopia 2.1.1 설치기에 자세히 소개되어 있습니다. 이전 강좌를 보시지 않으신 분은 QTopia 2.1.1 설치기를 먼저 보십시오. 이후로는 임베디드 보드에서 진행합니다. 임베디드 보드는 ESP-MMI 보드를 이용했습니다. ]$ mount -t nfs -o nolock 192.168.10.50:/공유폴더 /mnt/nfs -> nfs로 개발 PC와 연결합니다. ]$ cd /app/qpe -> qtopia가 설치된 폴더로 이동 ]$ cp /mnt/nfs/hello2/hello . -> 개발 PC로부터 실행파일 복사 ]$ source qpe.env -> qtopia 환경 변수 설정 ]$ ./bin/qpe & -> qtopia 를 실행 ]$ ./hello -> 프로그램 실행

실행한 화면 모습입니다.

흠~ 임베디드 보드에서 실행하는 것은 처음 보았기 때문에 제가 생각했던 모습은 아니군요.  마지 X-Window에서 실행하듯 윈도우 모습으로 캡션과 보더가 있습니다. 어쩐지 자료 검색 중에 보더를 없애는 방법이라는 것을 본 적이 있었습니다. 그 때는 QT/X11에 대해서만 인 줄 알았는데 그게 아니군요. ^^

이번에는 launcher 실행해 보았습니다. 정말 단순한 그래픽 출력 라이브러리가 아닙니다. ^^

 

태그: *QT *그래픽