이번 포스팅에서는 Qt 환경에서 Cross Compile을 하는 방법을 설명하겠습니다.

Cross Compile이란 한 시스템에서 개발한 프로그램이나 소스 등을 다른 시스템에서도 사용할 수 있도록 설정하는 과정입니다.

 

예를 들어 64-bit 리눅스 환경에서 프로그램을 하나 개발하였습니다.

이 프로그램을 다른 시스템에서 실행하고 싶지만 64-bit가 아닌 32-bit의 리눅스 환경이라면 해당 프로그램은 실행이 불가능합니다.

 

64-bit 환경에서 만든 프로그램을 ARM CPU의 시스템 32-bit 환경에서 실행시키는 방법으로,

ARM CPU 32-bit 시스템 부에는 Qt Embedded를 설치해야 하고, Cross Compile을 진행할 64-bit 시스템 부에서는Toolchain 설치 및 Qt 설정이 필요합니다.

 

■ ARM CPU (32-bit 시스템 부)

1. 먼저 ARM CPU를 가진 32-bit 시스템에 Qt-Embedded를 설치하여야 합니다.

설치는 QT 공식 홈페이지에서 Download -> Qt for Application Development -> Get Open Source -> View All-in the archive 후 

qt-everywhere-opensource-src-4.8.6.tar.gz 파일을 다운받습니다.

링크: http://download.qt.io/archive/qt/4.8/4.8.6/qt-everywhere-opensource-src-4.8.6.tar.gz

 

2. 다운로드 받은 파일의 압축을 해제한 후 해제한 폴더로 이동합니다.

# tar zxvf qt-everywhere-opensource-src-4.8.6.tar.gz
# cd qt-everywhere-opensource-src-4.8.6

 

 3. qmake.conf 파일을 텍스트 편집기로 열어줍니다.

# gedit mkspecs/qws/linux-arm-gnueabi-g++/qmake.conf

 

4. 아래의 내용을 복사하여 위에서 연 qmake.conf 파일에 붙여 넣습니다.

#
# qmake configuration for building with arm-none-linux-gnueabi-g++
#

include(../../common/linux.conf)
include(../../common/gcc-base-unix.conf)
include(../../common/g++-unix.conf)
include(../../common/qws.conf)

# modifications to g++.conf
QMAKE_CC = arm-linux-gnueabihf-gcc
QMAKE_CXX = arm-linux-gnueabihf-g++
QMAKE_LINK = arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++

# modifications to linux.conf
QMAKE_AR = arm-none-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY = arm-none-linux-gnueabihf-objcopy
QMAKE_STRIP = arm-none-linux-gnueabihf-strip

load(qt_config)


5. 파일을 붙여 넣었으면 아래의 명령어로 Qt-Embedded의 설치를 위한 환경을 설정합니다.

# ./configure \
-embedded arm \
-xplatform qws/linux-arm-gnueabi-g++ \
-little-endian \
-opensource \
-host-little-endian \
-confirm-license \
-nomake demos \
-nomake examples \
-no-webkit \
-no-gui \
-prefix [Qt-embedded-4.8.6 설치할 경로]

 

6. 설정을 완료하면 아래의 명령어로 Qt-Embedded를 설치합니다.

# make
# make install

 

■ Cross Compile을 진행할 PC (64-bit 시스템 부)

1. Yocto Source Package를 설치합니다. Yocto Project는 리눅스 기반의 임베디드 제품의 소프트웨어 패키지를 빌드하는 툴로,

현재는 업계 표준 패키징 솔루션이라고 할 수 있습니다.

# yum update

# yum install phablet-tools sed wget cvs subversion git-core coreutils unzip texi2html texinfo docbook-utils gawk python-pysqlite2 diffstat help2man desktop-file-utils chrpath autoconf automake groff xterm

 

2. ARM CPU를 가진 시스템이므로 ARM Cross Compile Toolchain인 arm-linux-gnueabihf-gcc를 설치합니다.

Toolchain은 "A toolchain is the set of compiler + linker + librarian + any other tools you need to produce theexecutable (+ shared libraries, etc) for the target."을 뜻합니다.

# mkdir /home/[Toolchain설치할 폴더 명]

# cd /home/[Toolchain설치할 폴더 명]

# wget https://releases.linaro.org/archive/14.04/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.bz2

# tar xjf gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.bz2

 

- 설치 중 ld-linux.so.2 관련 오류가 발생할 경우 구성요소가 설치되어 있지 않은 경우이므로 해당 명령어로 설치합니다.

# yum install glibc.i686 libgcc.i686 libstdc++.i686
# yum install zlib.i686
# yum install ncurses

 

3. 파일을 생성하여 환경 변수를 설정한 후 실행합니다.

# vi /etc/profile.d/[생성할 쉘 스크립트 명.sh]

# export PATH=$PATH:[Toolchain을 설치한 경로]/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/bin:[Toolchain을 설치한 경로]/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/lib

# source /etc/profile.d/[생성한 쉘 스크립트 명.sh]

 

- Version 정보가 정상적으로 출력되면 설치가 완료된 것 입니다.

# arm-linux-gnueabihf-gcc --version

 

4. 이제 설치한 arm-linux-gnueabihf-gcc를 Qt Options에서 Compiler 관련 부분에 추가 해줘야 합니다.

- Qt Creator를 실행한 후 상단 메뉴 탭에서 Tools – Options 선택합니다.

- Options 창에서 왼쪽 메뉴의 Build & Run 선택 후 Compiler 탭을 선택합니다.

  ① Add – GCC – C를 선택합니다. Name을 입력해주고 Browse를 눌러 [Toolchain 설치한 경로]/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/bin에서 arm-linux-gnueabihf-gcc를 선택합니다.

② Add – GCC – C++를 선택합니다. Name을 입력해주고 Browse를 눌러 [Toolchain 설치한 경로]/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/bin에서 arm-linux-gnueabihf-g++를 선택합니다.

 

5. ARM CPU 쪽에 대한 Device를 설정해주어야 합니다.

 - Devices 탭에서 Add를 선택하여 추가 마법사 창이 나타나면 Generic Linux Device를 선택하고 Start Wizard 버튼을 선택합니다.

 - 장치의 이름과 IP, 사용자명, 암호를 입력해줍니다. 192.168.0.230은 Target 시스템의 IP 주소입니다.

 

6. arm-linux-gnueabihf-gcc 관련 컴파일러들을 Kits에 추가합니다.

- Options 탭을 열고 왼쪽 메뉴의 Build & Run 에서 Kits 탭으로 이동하여 Add 버튼을 선택합니다.

- 새로운 Kit에 대한 Name을 입력 후 Sysroot 항목 Browse를 눌러 [ToolChain 설치한 경로]/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux로 선택합니다.

- Qt Version을 ARM CPU에 설치한 Qt 4.8.6 (Qt-Embedded) 버전으로 변경합니다.

 

이제 Qt Projects 창에서 Kit를 변경하면 프로그램 Build 시 arm-linux-gnueabihf-gcc를 이용하여 Compile을 진행하기 때문에

만들어진 실행 프로그램은 ARM CPU 시스템의 32-bit 환경에서 실행이 가능합니다.

물론 이 프로그램을 64-bit 환경에서 다시 실행시키기 위해서는 기존 64-bit Compiler의 Kit를 이용해야 합니다. 

Qt에서는 여러 개의 Kit들을 미리 만들 수 있어, Kit를 시스템의 환경에 따라 선택함으로써 유연하게 적용이 가능합니다. 

 

추가로 ARM 32-bit Target 시스템에 실행 파일을 바로 생성할 수 있는데 Project 파일에서 아래와 같이 입력하면

Target 시스템의 경로에 실행파일이 생성된 것을 확인할 수 있습니다.

.pro 파일

target.path = [실행 파일을 생성할 경로]

INSTALLS += target