한국어
Qt
 

이글에서는 qbs 의 기본적인 (Hello world 예제를 통해)사용방법을 소개한다.

 

컴파일 환경 : 우분투 18.04

 

로컬 시스템 컴파일

먼저 다음의 명령으로 컴파일러등 관련 패키지를 설치한다.

sudo apt install build-essential pkg-config

 

다음과 같이 main.cpp hello.qbs 를 작성한다.

$ mkdir helloworld

$ cd helloworld/

$ vim main.cpp

#include <iostream>

using namespace std;

int main()
{
    cout << "Hello World!" << endl;
    return 0;
}

 

$ vim hello.qbs

import qbs

CppApplication{
    name: "example"
    files: ["main.cpp"]
}

 

컴파일 실행은 매우 간단하다. 다음의 명령줄로 실행하면된다.

$ qbs

 

컴파일 후 바로 실행해보려면 다음의 명령줄로 실행하면된다.

$ qbs run

 

 

 

외부 라이브러리 링크

이번에는 외부 라이브러리를 링크해서 컴파일하는 경우이다. cairo라이브러리를 이용해서 Hello world를 png이미지로 출력하는 간단한 프로그램이다. (참고로 cairo는 플랫폼에 의존하지 않는 크로스플랫폼 2D 그래픽 라이브러리이다.)

 

데비안 계열 리눅스에서 다음의 명령으로 설치할 수 있다.
sudo apt install libcairo2-dev

 

그리고 다음과 같이 qbs파일에 Depends를 추가한다.

*.qbs

import qbs

CppApplication{
    name: "example"
    files: "main.cpp"

    Depends{
        name: "cairo"
    }
}

 

main.cpp

#include <cairo.h>
#include <iostream>

int main(void){
    cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 240, 80);
    cairo_t *cr = cairo_create (surface);

    cairo_select_font_face (cr, "serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
    cairo_set_font_size (cr, 32.0);
    cairo_set_source_rgb (cr, 0.0, 0.0, 1.0);
    cairo_move_to (cr, 10.0, 50.0);
    cairo_show_text (cr, "Hello, world");

    cairo_destroy (cr);
    cairo_surface_write_to_png (surface, "hello.png");
    cairo_surface_destroy (surface);
    return 0;
}

 

컴파일 후 바로 실행 png이미지 생성

$ qbs run

hello.png

 

 

크로스 컴파일

이번엔 크로스컴파일 방법이다.

크로스 컴파일을 하려면 먼저 크로스툴체인을 위한 환경이 구성되어야한다.

예를 들어 크로스툴체인이 환경 셋업 스크립트를 제공하는 경우 다음과 같이 설정할 수 있다.

$ source environment-setup-cortexa9t2hf-neon-fslc-linux-gnueabi

 

그런다음 시스템에서 툴체인을 감지하기위해 다음의 명령줄을 실행해본다.

$ qbs setup-toolchains --detect

Trying to detect gcc...

Profile 'arm-fslc-linux-gnueabi-gcc' created for '/opt/fslc-framebuffer/2.7/sysroots/x86_64-fslcsdk-linux/usr/bin/arm-fslc-linux-gnueabi/arm-fslc-linux-gnueabi-gcc'.

Trying to detect clang...

Trying to detect IAR toolchains...

No IAR toolchains found.

Trying to detect KEIL toolchains...

No KEIL toolchains found.

Trying to detect SDCC toolchains...

No SDCC toolchains found.

clang not found.

 

x86용 gcc와 arm용 gcc가 감지되었다.

 

프로필 목록은 다음의 명령줄로 볼 수있다.

$ qbs config --list profiles

profiles.arm-fslc-linux-gnueabi-gcc.cpp.toolchainInstallPath: "/opt/fslc-framebuffer/2.7/sysroots/x86_64-fslcsdk-linux/usr/bin/arm-fslc-linux-gnueabi"

profiles.arm-fslc-linux-gnueabi-gcc.cpp.toolchainPrefix: "arm-fslc-linux-gnueabi-"

profiles.arm-fslc-linux-gnueabi-gcc.qbs.sysroot: "/opt/fslc-framebuffer/2.7/sysroots/cortexa9t2hf-neon-fslc-linux-gnueabi"

profiles.arm-fslc-linux-gnueabi-gcc.qbs.toolchain: "gcc"

profiles.gcc.cpp.toolchainInstallPath: "/usr/bin"

profiles.gcc.qbs.toolchain: "gcc"

 

기본 프로파일 보기 명령

$ qbs config defaultProfile

 

환경구성 UI도구를 실행하여 크로스 툴체인 설정을 할 수 있다.

$ qbs config-ui

 

config-ui를 실행하여 sysroot를 설정하였다.

profiles - arm-fslc-linux-gnueabi-gcc - qbs - 마우스 오른쪽 버튼 - Add new key below 'qbs'

 

다음의 내용과 같이 입력 후 저장한다.

key: sysroot

value: /opt/fslc-framebuffer/2.7/sysroots/cortexa9t2hf-neon-fslc-linux-gnueabi

 

cpp 모듈에는 C/C++ 툴체인에 대한 속성 및 규칙들을 설정할 수 있다. 이를 통해 hello.qbs 에 몇가지 컴파일 옵션을 추가해야한다.

import qbs

CppApplication{
    name: "example"
    
    cpp.cxxFlags: ["-mfloat-abi=hard", "-mthumb", "-mfpu=neon", "-mcpu=cortex-a9"]
    
    files: "main.cpp"
}

 

추가해준 컴파일 옵션에 대해 간단한 설명이다. 


-mfloat-abi

부동 소수점 연산에 하드웨어 명령어 또는 소프트웨어 라이브러리 함수를 사용할지 여부와 부동 소수점 매개 변수 및 리턴 값을 전달하는 데 사용되는 레지스터를 지정한다.

 

soft

부동 소수점 연산 및 소프트웨어 부동 소수점 링크를위한 소프트웨어 라이브러리 포함.

 

softfp

하드웨어 부동 소수점 명령어 및 소프트웨어 부동 소수점 링크.

 

hard

하드웨어 부동 소수점 명령어 및 하드웨어 부동 소수점 링크.

 

-mfloat-abi=soft를 지정하면 -mfpu 옵션을 지정해도 효과가 없다.

 

 

-mfpu

FPU 아키텍처를 지정. 사용 가능한 부동 소수점 하드웨어.

 

none

컴파일러가 하드웨어 기반 부동 소수점 함수를 사용하지 못하게한다.

 

vfp

VFPv2 (ARM11, ARMv5, ARMv6에서 사용)

 

neon

VFPv3 (ARMv7인 Cortex-A8부터 사용되는 고급 SIMD. NEON기술로 불린다.)

 

 

-mthumb

Thumb 상태에서 실행되는 코드 생성


 

추가된 프로필(크로스툴체인)로 컴파일을 실행한다.

$ qbs build profile:arm-fslc-linux-gnueabi-gcc

 

컴파일된 파일 속성

$ file example

example: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-, BuildID[sha1]=7db5851f2247b3fcc36acc6d35439b0de7a5bffd, for GNU/Linux 3.2.0, with debug_info, not stripped

번호 제목 글쓴이 날짜 조회 수
공지 Qt프로그래밍(QtQuick) Beginner를 위한 글 읽는 순서 운영자 2019.01.05 85893
119 임의의 메모리 영역(QImage)에 QPainter를 이용하여 그리기 file makersweb 2017.12.19 3444
118 QML 코딩 규칙 makersweb 2021.09.05 3237
» qbs 사용 방법(Helloworld) file makersweb 2019.10.23 3094
116 QString 문자열에서 숫자만 추출해서 QString으로 반환 makersweb 2017.01.10 3077
115 다국어 지원 어플리케이션 개발 file makersweb 2018.01.27 2976
114 QTextCodec클래스를 사용하여 유니코드와 EUC-KR 변환 makersweb 2019.03.25 2892
113 컨테이너 클래스 - QVector makersweb 2020.03.17 2839
112 UI 폼(Form)작성 시 탭 순서(Tab Order) 설정 file makersweb 2020.08.24 2777
111 QML에서 멀티 스레드(multithreading) 프로그래밍 file makersweb 2019.05.25 2654
110 Qt5기반 독립 프로세스(out-of-process)로 동작하는 가상키보드(virtual keyboard) file makersweb 2019.02.24 2628
109 구글 클라우드 Speech-To-Text API를 Qt기반(C++, Qml)테스트 [7] file makersweb 2019.01.20 2617
108 Qt3D의 QML 타입으로 3D렌더링 file makersweb 2019.11.20 2527
107 리눅스에서 Qt4.8기반 어플리케이션의 한글입력 file makersweb 2018.11.29 2436
106 QtWayland와 ivi-compositor file makersweb 2018.12.27 2403
105 [Qt News] Qt6 Git 개발 초기 단계 시작하기 j2doll 2019.08.02 2329
104 QOpenVirtualkeyboard(Qt 5용 한글 및 영문, 숫자 가상키보드) file makersweb 2019.11.27 2241
103 main함수 명령줄 옵션 해석 makersweb 2020.09.01 2231
102 Qt Creator에서 임베디드 장치로 deploy설정(Custom Process Step) file makersweb 2019.06.15 2200
101 OpenGL 렌더링을 QtQuick과 통합하는 방법 file makersweb 2019.10.01 2181
100 Qt Creator에서 Qt의존성 라이브러리 자동복사하기 file makersweb 2019.10.19 2163