Code::Blocksを使用してのWindows環境C++言語 LVGL + SDL ライブラリ使用方法
Windows上でのCode::Blocks上でLVGL(Light and Versatile Graphics Library)をSDL(Simple DirectMedia Layer)ライブラリ経由で使用する方法です。
以下の記事の通りに環境構築してある前提での説明をします。
LVGL(Light and Versatile Graphics Library)のダウンロード
以下のURLからLVGLをダウンロードしておきます。
2024/08時点では、v9.1.0が最新のリリースのようです。
「lvgl-9.1.0.zip」をダウンロードしておきました。
LVGLのポーティング
LVGLは様々な環境で動くように設計されたグラフィックライブラリです。
実はコンピュータ上で動作することも可能です。
複雑な開発になると、コンピュータ上でもプレビューできたほうが嬉しいのではないでしょうか?
LVGLのソースコードを見てみると、Linux向け(フレームバッファ他)、Windows向け、SDL向けなど、様々なドライバが同封されていることがわかります。
ドキュメントを見てみましょう。
ご覧のように様々なプロジェクトが提供されています。
Code::Blocks向けのプロジェクトは提供されていますが、いくつかの問題があります。
上記ファイルをダウンロードしてすぐに使用開始できるかと思いきや、現在のCode::Blocksに同封されているコンパイラのバージョンでは古く、Windows向けドライバをビルドすることができません。
- https://forum.lvgl.io/t/how-to-upgrade-mingw-for-code-blocks/15382
- https://github.com/lvgl/lv_port_win_codeblocks/blob/master/docs/upgrade_MinGW.md
公式の手順では、インストールフォルダ内のコンパイラを入れ替えるというアグレッシブな方法が案内されています。
流石にインストールしたアプリ内のコンパイラを入れ替えるのには抵抗があります。
また、移植性の問題です。
このプロジェクトでは、Win32 APIを使用して描画しているため、Windows上でしか動作しないLVGL設定となっています。
私はメインマシンでWindowsを使用しますし、組み込みではLinuxも触ります。
Windowsに限定せずに動作してくれるとありがたいです。
そのため、各種OSで動作するSDL経由で動かすことにします。
わかりやすいVSCode向けのプロジェクトからCode::Blocksに移植してみることにしましょう。
プロジェクトの作成
Code::Blocksを使用してのWindows環境C++言語SDLライブラリ使用方法の手順の通りにプロジェクトを作成しておきます。
今回はDドライブ直下に「lvgl_test」というプロジェクトを準備しました。
なお、LVGLのビルドには、Code::Blocksを使用してのWindows環境C++言語CLIアプリ開発方法チュートリアルで設定したコンパイラオプション「-fexec-charset=CP932」が干渉してビルドできないため、設定を外しておいたほうが良いです。
ソースコード中でIDEがUTF8を扱えるかどうか判定(lv_init.c:211行目)が入っているようで、文字コードを指定してしまうとビルドに失敗します。
プロジェクト内には以下のファイルを展開しておきます。
- https://github.com/libsdl-org/SDL/releases/download/release-2.30.6/SDL2-devel-2.30.6-mingw.zip
- https://github.com/lvgl/lvgl/archive/refs/tags/v9.1.0.zip
- https://github.com/lvgl/lv_port_pc_vscode/archive/e08bfca8aab3fe548075ae2176751fa6186de812.zip
「lv_port_pc_vscode」内の「lvgl」フォルダはサブモジュールになっていて、「lvgl」とリンクしています。
Gitを使用してサブモジュールごとまとめてダウンロード出来る場合には、上記ZIPファイルを両方用意する必要はありません。
SDLはCode::Blocksを使用してのWindows環境C++言語SDLライブラリ使用方法の手順で静的リンクにしてあります。
「lv_port_pc_vscode」からは必要な以下のファイルのみトップに持ってきました。
- lv_conf.h
- main.cpp(拡張子変更c→cpp)
- mouse_cursor_icon.c
他、LVGLとSDLを用意しました。
プロジェクトフォルダ内は以下のようなディレクトリ構造にします。
D:.
├─lvgl
│ ├─.devcontainer
│ ├─.github
│ │ ├─ISSUE_TEMPLATE
│ │ └─workflows
│ ├─demos
│ │ ├─benchmark
│ │ │ └─assets
│ │ ├─flex_layout
│ │ ├─keypad_encoder
│ │ ├─multilang
│ │ │ └─assets
│ │ │ ├─avatars
│ │ │ ├─emojis
│ │ │ └─fonts
│ │ ├─music
│ │ │ └─assets
│ │ │ └─png
│ │ │ ├─272_png
│ │ │ └─480_png
│ │ ├─render
│ │ │ └─assets
│ │ ├─scroll
│ │ ├─stress
│ │ ├─transform
│ │ │ └─assets
│ │ ├─vector_graphic
│ │ │ └─assets
│ │ └─widgets
│ │ └─assets
│ │ └─font
│ ├─docs
│ │ ├─flyers
│ │ ├─get-started
│ │ ├─integration
│ │ │ ├─bindings
│ │ │ ├─building
│ │ │ ├─chip
│ │ │ ├─driver
│ │ │ │ ├─display
│ │ │ │ └─touchpad
│ │ │ ├─framework
│ │ │ ├─ide
│ │ │ └─os
│ │ ├─intro
│ │ ├─layouts
│ │ ├─libs
│ │ ├─misc
│ │ ├─others
│ │ ├─overview
│ │ │ └─renderers
│ │ ├─porting
│ │ ├─widgets
│ │ ├─_ext
│ │ ├─_static
│ │ │ ├─css
│ │ │ ├─img
│ │ │ └─js
│ │ └─_templates
│ ├─env_support
│ │ ├─cmake
│ │ ├─cmsis-pack
│ │ ├─esp
│ │ │ └─rlottie
│ │ ├─pikascript
│ │ ├─rt-thread
│ │ │ └─squareline
│ │ │ └─ui
│ │ │ └─lvgl
│ │ └─zephyr
│ ├─examples
│ │ ├─anim
│ │ ├─arduino
│ │ │ └─LVGL_Arduino
│ │ ├─assets
│ │ │ ├─emoji
│ │ │ └─font
│ │ ├─event
│ │ ├─get_started
│ │ ├─layouts
│ │ │ ├─flex
│ │ │ └─grid
│ │ ├─libs
│ │ │ ├─barcode
│ │ │ ├─bmp
│ │ │ ├─ffmpeg
│ │ │ ├─freetype
│ │ │ ├─gif
│ │ │ ├─libjpeg_turbo
│ │ │ ├─libpng
│ │ │ ├─lodepng
│ │ │ ├─qrcode
│ │ │ ├─rlottie
│ │ │ ├─tiny_ttf
│ │ │ └─tjpgd
│ │ ├─others
│ │ │ ├─file_explorer
│ │ │ ├─fragment
│ │ │ ├─gridnav
│ │ │ ├─ime
│ │ │ ├─imgfont
│ │ │ ├─monkey
│ │ │ ├─observer
│ │ │ └─snapshot
│ │ ├─porting
│ │ ├─scroll
│ │ ├─styles
│ │ └─widgets
│ │ ├─animimg
│ │ ├─arc
│ │ ├─bar
│ │ ├─button
│ │ ├─buttonmatrix
│ │ ├─calendar
│ │ ├─canvas
│ │ ├─chart
│ │ ├─checkbox
│ │ ├─dropdown
│ │ ├─image
│ │ ├─imagebutton
│ │ ├─keyboard
│ │ ├─label
│ │ ├─led
│ │ ├─line
│ │ ├─list
│ │ ├─menu
│ │ ├─msgbox
│ │ ├─obj
│ │ ├─roller
│ │ ├─scale
│ │ ├─slider
│ │ ├─span
│ │ ├─spinbox
│ │ ├─spinner
│ │ ├─switch
│ │ ├─table
│ │ ├─tabview
│ │ ├─textarea
│ │ ├─tileview
│ │ └─win
│ ├─scripts
│ │ ├─built_in_font
│ │ └─release
│ ├─src
│ │ ├─core
│ │ ├─display
│ │ ├─draw
│ │ │ ├─nxp
│ │ │ │ ├─pxp
│ │ │ │ └─vglite
│ │ │ ├─renesas
│ │ │ │ └─dave2d
│ │ │ ├─sdl
│ │ │ ├─sw
│ │ │ │ ├─arm2d
│ │ │ │ └─blend
│ │ │ │ ├─arm2d
│ │ │ │ ├─helium
│ │ │ │ └─neon
│ │ │ └─vg_lite
│ │ ├─drivers
│ │ │ ├─display
│ │ │ │ ├─drm
│ │ │ │ ├─fb
│ │ │ │ ├─ili9341
│ │ │ │ ├─lcd
│ │ │ │ ├─st7735
│ │ │ │ ├─st7789
│ │ │ │ ├─st7796
│ │ │ │ └─tft_espi
│ │ │ ├─evdev
│ │ │ ├─libinput
│ │ │ ├─nuttx
│ │ │ ├─sdl
│ │ │ ├─windows
│ │ │ └─x11
│ │ ├─font
│ │ ├─indev
│ │ ├─layouts
│ │ │ ├─flex
│ │ │ └─grid
│ │ ├─libs
│ │ │ ├─barcode
│ │ │ ├─bin_decoder
│ │ │ ├─bmp
│ │ │ ├─ffmpeg
│ │ │ ├─freetype
│ │ │ ├─fsdrv
│ │ │ ├─gif
│ │ │ ├─libjpeg_turbo
│ │ │ ├─libpng
│ │ │ ├─lodepng
│ │ │ ├─lz4
│ │ │ ├─qrcode
│ │ │ ├─rle
│ │ │ ├─rlottie
│ │ │ ├─thorvg
│ │ │ ├─tiny_ttf
│ │ │ └─tjpgd
│ │ ├─misc
│ │ │ └─cache
│ │ ├─osal
│ │ ├─others
│ │ │ ├─file_explorer
│ │ │ ├─fragment
│ │ │ ├─gridnav
│ │ │ ├─ime
│ │ │ ├─imgfont
│ │ │ ├─monkey
│ │ │ ├─observer
│ │ │ ├─snapshot
│ │ │ ├─sysmon
│ │ │ └─vg_lite_tvg
│ │ ├─stdlib
│ │ │ ├─builtin
│ │ │ ├─clib
│ │ │ ├─micropython
│ │ │ └─rtthread
│ │ ├─themes
│ │ │ ├─default
│ │ │ ├─mono
│ │ │ └─simple
│ │ ├─tick
│ │ └─widgets
│ │ ├─animimage
│ │ ├─arc
│ │ ├─bar
│ │ ├─button
│ │ ├─buttonmatrix
│ │ ├─calendar
│ │ ├─canvas
│ │ ├─chart
│ │ ├─checkbox
│ │ ├─dropdown
│ │ ├─image
│ │ ├─imagebutton
│ │ ├─keyboard
│ │ ├─label
│ │ ├─led
│ │ ├─line
│ │ ├─list
│ │ ├─menu
│ │ ├─msgbox
│ │ ├─objx_templ
│ │ ├─roller
│ │ ├─scale
│ │ ├─slider
│ │ ├─span
│ │ ├─spinbox
│ │ ├─spinner
│ │ ├─switch
│ │ ├─table
│ │ ├─tabview
│ │ ├─textarea
│ │ ├─tileview
│ │ └─win
│ └─tests
│ ├─makefile
│ ├─micropy_test
│ ├─ref_imgs
│ │ ├─draw
│ │ │ └─render
│ │ │ ├─argb8888
│ │ │ ├─rgb565
│ │ │ ├─rgb888
│ │ │ └─xrgb8888
│ │ ├─libs
│ │ │ └─font_stress
│ │ └─widgets
│ ├─src
│ │ ├─test_assets
│ │ ├─test_cases
│ │ │ ├─cache
│ │ │ ├─draw
│ │ │ ├─libs
│ │ │ └─widgets
│ │ ├─test_files
│ │ │ ├─binimages
│ │ │ ├─fonts
│ │ │ │ └─noto
│ │ │ ├─lz4_compressed
│ │ │ └─rle_compressed
│ │ └─test_libs
│ │ └─rnd_unicodes
│ │ └─rnd_unicodes
│ │ └─src
│ ├─test_images
│ │ ├─pngs
│ │ ├─stride_align1
│ │ │ ├─LZ4
│ │ │ ├─RLE
│ │ │ └─UNCOMPRESSED
│ │ └─stride_align64
│ │ ├─LZ4
│ │ ├─RLE
│ │ └─UNCOMPRESSED
│ └─unity
└─SDL2-2.30.6
├─cmake
├─docs
├─i686-w64-mingw32
│ ├─bin
│ ├─include
│ │ └─SDL2
│ ├─lib
│ │ ├─cmake
│ │ │ └─SDL2
│ │ └─pkgconfig
│ └─share
│ └─aclocal
├─test
│ ├─emscripten
│ ├─n3ds
│ ├─nacl
│ └─shapes
└─x86_64-w64-mingw32
├─bin
├─include
│ └─SDL2
├─lib
│ ├─cmake
│ │ └─SDL2
│ └─pkgconfig
└─share
└─aclocal
bin/objフォルダはビルド時に生成されるものなので気にしなくて良いです。
プロジェクトのビルドオプション設定
上部メニューから「Project」→「Build options...」を開きます。
こちらも左側のツリーから「Debug」と「Release」それぞれビルドごとに設定があります。
「Search directories」タブにて設定するもの
タブ中の「Compiler」タブにて、「Add」、SDLの設定に加えて、「lvgl」相対パスを追加。
フォルダ指定する際に「Keep this as a relative path?」と相対パスにするかどうか聞かれるので「はい(Y)」で相対パスにしておきます。
プロジェクトディレクトリからの相対パスにしておけば、プロジェクトフォルダを移動しても読み込まれるでしょう。
プロジェクトへのLVGLファイル追加
プロジェクトの設定から、Code::BlocksにLVGLのソースコードを登録しておきます。
ここでソースコードが登録されていないと、ヘッダファイルをインクルードしてもビルドに使用されず、リンクできないようです。
LVGLサンプルの動作
ここまでの手順でコンパイルが可能になっていると思われます。
数十秒でビルドが完了するはずです。
コンピュータ上にてLVGLのコードが動作しました!
参考リンク
こちらの記事も参考にどうぞ