1. 程式人生 > >在樹莓派(Raspberry Pi)上Qt5的本地構建

在樹莓派(Raspberry Pi)上Qt5的本地構建

        網上有很多關於在Raspberry Pi上構建Qt5的教程,但所有或大部分教程都是使用桌面機器交叉編譯Raspberry Pi的二進位制檔案。如果您交叉編譯,您將無法執行qmake並在Raspberry Pi本身上建立。本教程旨在向您展示如何在Raspberry Pi上本機編譯Qt 5,以便您可以在不交叉編譯或依賴外部桌面的情況下使用qmake和Raspberry Pi本身。在這裡可以找到一組關於從Raspberry Pi 2上的原始碼壓縮包構建Qt5的更新指令。
        首先從獲得最新版本的Raspbian或5月23日版本(我用於本教程的版本)開始。您至少需要一張16GB的SD卡,因為所需的空間有點超過4GB(8G SD卡可能不夠用)。還要確保您使用的是具有512MB RAM的B型或B型。早期的樹莓派裝有256 MB的RAM,這是不夠的,並會導致gcc錯誤。
        開啟Raspberry Pi並登入。確保它已正確連線到網際網路,並且您的電源至少為1A。你可能也想超頻你的Pi。我以900 MHz的頻率超頻,花了38個小時編譯,溫度穩定在51 C - 54 C(帶外殼,沒有散熱片,沒有風扇)。

安裝編譯所需的軟體包:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install libfontconfig1-dev libdbus-1-dev libfreetype6-dev libudev-dev libicu-dev libsqlite3-dev
libxslt1-dev libssl-dev libasound2-dev libavcodec-dev libavformat-dev libswscale-dev libgstreamer0.10-dev
libgstreamer-plugins-base0.10-dev gstreamer-tools gstreamer0.10-plugins-good gstreamer0.10-plugins-bad
libraspberrypi-dev libpulse-dev libx11-dev libglib2.0-dev libcups2-dev freetds-dev libsqlite0-dev libpq-dev
libiodbc2-dev libmysqlclient-dev firebird-dev libpng12-dev libjpeg9-dev libgst-dev libxext-dev libxcb1 libxcb1-dev
libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0
libxcb-shm0-dev libxcb-icccm4 libxcb-icccm4-dev libxcb-sync1 libxcb-sync-dev libxcb-render-util0
libxcb-render-util0-dev libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-glx0-dev
libxi-dev libdrm-dev libssl-dev libxcb-xinerama0 libxcb-xinerama0-dev

    2017年3月23日更新:對於PI3,使用最新版本的Raspbian(4.4.5),彙編需要過夜。

    然後讓你的構建目錄:

mkdir ~/opt
cd ~/opt

    從git中檢索qt5原始碼:

git clone git://code.qt.io/qt/qt5.git

    檢索其他元件的git原始碼

cd qt5
./init-repository
        不要應用任何可用的補丁。 最新的Qt5不再需要它們。 git原始碼應該在配置引數中使用一些技巧進行編譯,而不需要任何補丁。

    首先確保你在qt5目錄中。

cd ~/opt/qt5

為了使配置指令碼正確構建所有的Makefiles,您需要調整〜/opt/qt5/qtbase/configure指令碼。使用您最喜歡的文字編輯器(vim,nano,emacs),並在〜/opt/qt5/qtbase/configure指令碼(搜尋QT_CFLAGS_DBUS)中更改/新增以下程式碼:

# flags for raspberry pi build
# flags for libdbus-1
QT_CFLAGS_DBUS="-I/usr/include/dbus-1.0/ -I/usr/lib/arm-linux-gnueabihf/dbus-1.0/include/"
QT_LIBS_DBUS=-ldbus-1

# flags for Glib (X11 only)
QT_CFLAGS_GLIB="-I/usr/include/glib-2.0/ -I/usr/lib/arm-linux-gnueabihf/glib-2.0/include/"
QT_LIBS_GLIB=-lglib-2.0

QT_CFLAGS_PULSEAUDIO
="-I/usr/include/glib-2.0/ -I/usr/lib/arm-linux-gnueabihf/glib-2.0/include/" QT_LIBS_PULSEAUDIO="-lpulse -lpulse-mainloop-glib" # flags for GStreamer (X11 only) QT_CFLAGS_GSTREAMER="-I/usr/include/gstreamer-0.10/ -I/usr/include/glib-2.0/ -I/usr/lib/arm-linux- gnueabihf/glib-2.0/include/ -I/usr/include/libxml2/" QT_LIBS_GSTREAMER=

然後在配置指令碼中關閉檔案搜尋QT_CFLAGS_FONTCONFIG之前。 它應該位於上面的條目下方,您需要將else語句中的條目更改為:

QT_CFLAGS_FONTCONFIG=-I/usr/include/freetype2/

如果上述更改很難遵循,則可以使用以下修補程式檔案:

1030,1031c1030,1031
< QT_CFLAGS_DBUS=
< QT_LIBS_DBUS=
—
> QT_CFLAGS_DBUS="-I/usr/include/dbus-1.0/ -I/usr/lib/arm-linux-gnueabihf/dbus-1.0/include/"
> QT_LIBS_DBUS=-ldbus-1
1034,1035c1034,1038
< QT_CFLAGS_GLIB=
< QT_LIBS_GLIB=
—
> QT_CFLAGS_GLIB="-I/usr/include/glib-2.0/ -I/usr/lib/arm-linux-gnueabihf/glib-2.0/include/"
> QT_LIBS_GLIB=-lglib-2.0
>
> QT_CFLAGS_PULSEAUDIO="-I/usr/include/glib-2.0/ -I/usr/lib/arm-linux-gnueabihf/glib-2.0/include/"
> QT_LIBS_PULSEAUDIO="-lpulse -lpulse-mainloop-glib"
1038c1041
< QT_CFLAGS_GSTREAMER=
—
> QT_CFLAGS_GSTREAMER="-I/usr/include/gstreamer-0.10/ -I/usr/include/glib-2.0/ -I/usr/lib/arm-linux-
gnueabihf/glib-2.0/include/ -I/usr/include/libxml2/"
5123c5126
< QT_CFLAGS_FONTCONFIG=
—
> QT_CFLAGS_FONTCONFIG=-I/usr/include/freetype2/
        為了在Raspberry Pi上正確執行Qt5的配置,需要將CROSS_COMPILE變數指向位於/usr/bin/g++的本機編譯器。 CROSS_COMPILE引數是編譯器的路徑(不含g)。 如果你不這樣做,它會抱怨說它沒有被交叉編譯。
        所有輸出儲存在稱為“輸出”的檔案中,以防出現問題。 在輸出檔案的末尾,應該說你可以執行'make',如果不在輸出結尾查詢錯誤。

        不要擔心由於缺少軟體包而造成的某些事情不會發生,那些錯誤將會出現。 如果它沒有提到你可以執行make,然後檢查最後一個錯誤,它通常是顯示停止。 執行配置:

./configure -v -opengl es2 -device linux-rasp-pi-g''+ -device-option CROSS_COMPILE=/usr/bin/ -opensource
-confirm-license -optimized-qmake -reduce-exports -release -qt-pcre -make libs -prefix /usr/local/qt5 &> output
        2017年3月23日更新:對於帶有最新版Raspbian(4.4.5)的PI3,在預編譯標頭檔案時遇到問題,必須在./configure(在上面的程式碼中)中使用-no-pch引數。
        檢查輸出檔案,看看它是在構建你需要的元件(在輸出結束時,它將在將要構建的Qt元件旁邊有Yes),並且應該說你現在可以執行'make'。

        '輸出'檔案中的示例:


Build options:
 Configuration ………. accessibility accessibility-atspi-bridge alsa audio-backend c+''11 clock-gettime
clock-monotonic concurrent cross_compile cups dbus egl eglfs evdev eventfd fontconfig full-config getaddrinfo
getifaddrs glib gstreamer iconv icu inotify ipv6ifname large-config largefile libudev linuxfb medium-config
minimal-config mremap neon nis no-pkg-config opengl opengles2 openssl pcre png precompile_header pulseaudio
qpa qpa reduce_exports reduce_relocations release rpath shared small-config system-freetype system-jpeg
system-png system-zlib v8 v8snapshot xcb xcb-glx xcb-render xcb-xlib xinput2 xkbcommon-qt xlib xrender
 Build parts ………… libs
 Mode ………………. release
 Using C''+11 ………… yes
 Using PCH ………….. yes
 Target compiler supports:
 iWMMXt/Neon ………. no/yes

Qt modules and options:
 Qt D-Bus …………… yes (loading dbus-1 at runtime)
 Qt Concurrent ………. yes
 Qt GUI …………….. yes
 Qt Widgets …………. yes
 JavaScriptCore JIT .. yes (To be decided by JavaScriptCore)
 QML debugging ………. yes
 Use system proxies .. no

Support enabled for:
 Accessibility ………. yes
 ALSA ………………. yes
 CUPS ………………. yes
 FontConfig …………. yes
 Iconv ……………… yes
 ICU ……………….. yes
 Image formats:
 GIF ……………… yes (plugin, using system library)
 JPEG …………….. yes (plugin, using system library)
 PNG ……………… yes (in QtGui, using system library)
 Glib ………………. yes
 GStreamer ………….. yes
 GTK theme ………….. no
 Large File …………. yes
 libudev ……………. yes
 Networking:
 getaddrinfo ………. yes
 getifaddrs ……….. yes
 IPv6 ifname ………. yes
 OpenSSL ………….. yes (loading libraries at run-time)
 NIS ……………….. yes
 OpenGL …………….. yes (OpenGL ES 2.x)
 OpenVG …………….. no
 PCRE ………………. yes (bundled copy)
 pkg-config …………. no
 PulseAudio …………. yes
 QPA backends:
 DirectFB …………. no
 EGLFS ……………. yes
 KMS ……………… no
 LinuxFB ………….. yes
 XCB ……………… yes (system library)
 MIT-SHM ………… yes
 Xcursor ………… yes (loaded at runtime)
 Xfixes …………. yes (loaded at runtime)
 Xi …………….. no
 Xi2 ……………. yes
 Xinerama ……….. yes (loaded at runtime)
 Xrandr …………. yes (loaded at runtime)
 Xrender ………… yes
 XKB ……………. no
 XShape …………. yes
 XSync ………….. yes
 XVideo …………. yes
 Session management .. yes
 SQL drivers:
 DB2 ……………… no
 InterBase ………… no
 MySQL ……………. yes (plugin)
 OCI ……………… no
 ODBC …………….. yes (plugin)
 PostgreSQL ……….. yes (plugin)
 SQLite 2 …………. yes (plugin)
 SQLite …………… yes (plugin, using bundled copy)
 TDS ……………… yes (plugin)
 udev ………………. yes
 xkbcommon ………….. yes (bundled copy)
 zlib ………………. yes (system library)

NOTE: libxkbcommon 0.2.0 (or higher) not found on the system, will use
the bundled version from 3rd party directory.

Qt is now configured for building. Just run 'make'.
Once everything is built, you must run 'make install'.
Qt will be installed into /usr/local/qt5

Prior to reconfiguration, make sure you remove any leftovers from
the previous build.

        請注意,彙編將花費大約兩天的時間來編譯900 MHz超頻。 如果您遠端登入,請考慮使用byobu或螢幕,以便您可以分離會話。

        然後,您需要按如下所示執行make(檢查output_make檔案中的錯誤):
make &> output_make

如果那是好的,那麼執行make install(檢查output_make_install檔案中的錯誤):

sudo make install &> output_make_install

在此之後,你需要新增一些行到你的.bashrc檔案中:

export LD_LIBRARY_PATH=/usr/local/qt5/lib/
export PATH=/usr/local/qt5/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

您需要獲取.bashrc檔案來設定上述環境變數:

source ~/.bashrc

然後執行它並檢查它是否指向/usr/local/qt5/bin/qmake

which qmake

示例輸出:

[email protected] ~/opt/qt5 $ which qmake
/usr/local/qt5/bin/qmake

在此之後,您應該能夠編譯示例應用程式並執行它們。 試試OpenGL Cube(我沒有在X視窗中測試過,只能從控制檯中):

cp -r~/opt/qt5/qtbase/examples/opengl/cube ~/
cd~/cube
qmake
make
./cube