Qt wiki will be updated on October 12th 2023 starting at 11:30 AM (EEST) and the maintenance will last around 2-3 hours. During the maintenance the site will be unavailable.

Raspberry Pi Beginners Guide: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
h1. Beginner's guide to cross-compile Qt5 on RaspberryPi
h1. Beginner's guide to cross-compile Qt5 on RaspberryPi


[toc align_right="yes" depth="2"]
[toc align_right="yes" depth="2"]


== Introduction ==
== Introduction ==


This is a step by step guide to help beginners to: cross-compile QT5 for RaspberryPi(wheezy), create, deploy and run an example project. This article will focus on simplicity, so if you are looking for additional customization, please check a more "detailed guide":http://wiki.qt.io/RaspberryPi.
This is a step by step guide to help beginners to: cross-compile QT5 for RaspberryPi(wheezy), create, deploy and run an example project. This article will focus on simplicity, so if you are looking for additional customization, please check a more "detailed guide":http://wiki.qt.io/RaspberryPi.


For an easy install, try &quot;this script.&quot;:https://gist.github.com/raw/3488286/d1d301946297be999d96df632a0ad0095a4d77e7/bakeqtpi.bash<br />Or get a later version &quot;here&amp;quot;:http://gitorious.org/bakeqtpi<br />For help, run
For an easy install, try "this script.":https://gist.github.com/raw/3488286/d1d301946297be999d96df632a0ad0095a4d77e7/bakeqtpi.bash
Or get a later version "here":http://gitorious.org/bakeqtpi
For help, run


<code> $ ./bakeqtpi.bash —help<code>
<code> $ ./bakeqtpi.bash —help<code>
Line 13: Line 15:
== Getting Started ==
== Getting Started ==


First we create a folder to hold the source code and all the required files to do the cross-compilation. We chose to create a directory named &quot;opt&amp;quot; in the home folder:<br /></code>paulo</code>westeros:<sub>$ mkdir</sub>/opt<br />paulo<code>westeros:<sub>$ cd</sub>/opt<code>
First we create a folder to hold the source code and all the required files to do the cross-compilation. We chose to create a directory named "opt" in the home folder:
</code>paulo@westeros:~$ mkdir~/opt
paulo@westeros:~$ cd~/opt<code>


Now, download the following files:<br />* Raspbian Wheezy image from (&quot;here&amp;quot;:http://www.raspberrypi.org/downloads):<br /></code>paulo</code>westeros:<sub>/opt$ wget http://downloads.raspberrypi.org/raspbian_latest/ -O wheezy-raspbian-latest.zip<br />paulo<code>westeros:</sub>/opt$ unzip wheezy-raspbian-latest.zip<code><br />And mount it:<br /></code>paulo</code>westeros:<sub>/opt$ sudo mkdir /mnt/rasp-pi-rootfs<br />paulo<code>westeros:</sub>/opt$ sudo mount -o loop,offset=62914560 2015-02-16-raspbian-wheezy.img /mnt/rasp-pi-rootfs<code>
Now, download the following files:
* Raspbian Wheezy image from ("here":http://www.raspberrypi.org/downloads):
</code>paulo@westeros:~/opt$ wget http://downloads.raspberrypi.org/raspbian_latest/ -O wheezy-raspbian-latest.zip
paulo@westeros:~/opt$ unzip wheezy-raspbian-latest.zip<code>
And mount it:
</code>paulo@westeros:~/opt$ sudo mkdir /mnt/rasp-pi-rootfs
paulo@westeros:~/opt$ sudo mount -o loop,offset=62914560 2015-02-16-raspbian-wheezy.img /mnt/rasp-pi-rootfs<code>


* The toolchain built by Donald: (Note, seems to be dead links!)<br /></code>paulo</code>westeros:<sub>/opt$ wget https://www.dropbox.com/s/sl919ly0q79m1e6/gcc-4.7-linaro-rpi-gnueabihf.tbz<br />(or a mirror at http://swap.tsmt.eu/gcc-4.7-linaro-rpi-gnueabihf.tbz with sha1 f6255c6aca925239dc943d22a794f642daa17e65)<br />(or better at http://de.sourceforge.jp/projects/sfnet_rfidmonitor/downloads/crosscompilation-resources/gcc-4.7-linaro-rpi-gnueabihf.tbz<br />as the above noted links seem to be broken)<br />paulo<code>westeros:</sub>/opt$ tar -xf gcc-4.7-linaro-rpi-gnueabihf.tbz<code><br />Pro tip: don't build your own cross-compiler. You'll overlook something important and loose a couple of hours of your life for nothing. A suitable Raspberry Pi cross-compiler is also available here: https://github.com/raspberrypi/tools
* The toolchain built by Donald: (Note, seems to be dead links!)
</code>paulo@westeros:~/opt$ wget https://www.dropbox.com/s/sl919ly0q79m1e6/gcc-4.7-linaro-rpi-gnueabihf.tbz
(or a mirror at http://swap.tsmt.eu/gcc-4.7-linaro-rpi-gnueabihf.tbz with sha1 f6255c6aca925239dc943d22a794f642daa17e65)
(or better at http://de.sourceforge.jp/projects/sfnet_rfidmonitor/downloads/crosscompilation-resources/gcc-4.7-linaro-rpi-gnueabihf.tbz
as the above noted links seem to be broken)
paulo@westeros:~/opt$ tar -xf gcc-4.7-linaro-rpi-gnueabihf.tbz<code>
Pro tip: don't build your own cross-compiler. You'll overlook something important and loose a couple of hours of your life for nothing. A suitable Raspberry Pi cross-compiler is also available here: https://github.com/raspberrypi/tools


It is a 32-bit build so if you are running on a 64-bit machine (you probably are) you need to install ia32-libs:<br /></code>paulo</code>westeros:<sub>/opt$ sudo apt-get install ia32-libs</code>
It is a 32-bit build so if you are running on a 64-bit machine (you probably are) you need to install ia32-libs:
<br />* Clone the cross-compile-tools repository:<br /><code>paulo<code>westeros:</sub>/opt$ git clone git://gitorious.org/cross-compile-tools/cross-compile-tools.git<code>
</code>paulo@westeros:~/opt$ sudo apt-get install ia32-libs</code>


* Clone and init the Qt5 repository:<br /></code>paulo</code>westeros:<sub>/opt$ git clone git://gitorious.org/qt/qt5.git<br />paulo<code>westeros:</sub>/opt$ cd qt5<br />paulo</code>westeros:<sub>/opt/qt5$ ./init-repository</code><br />If you're behind a firewall ./init-repository might fail. First run this command:<br /><code>paulo<code>westeros:</sub>/opt/qt5$ sed <s>i 's/git:/https:git./' .gitmodules<code><br />Then retry:<br /></code>paulo</code>westeros:<sub>/opt/qt5$ ./init-repository -f</code>
* Clone the cross-compile-tools repository:
<br />* Finally, apply a patch on the qtjsbackend repository:<br /><code>paulo<code>wseteros:</sub>/opt/qt5$ cd <sub>/opt/qt5/qtjsbackend<br />paulo</code>wseteros:</sub>/opt/qt5/qtjsbackend$ git fetch https://codereview.qt.io/p/qt/qtjsbackend refs/changes/56/27256/4 &amp;&amp; git cherry-pick FETCH_HEAD</code>
<code>paulo@westeros:~/opt$ git clone git://gitorious.org/cross-compile-tools/cross-compile-tools.git<code>
<br />h2. Compiling qtbase
 
<br />Now the we have all the resources needed to compile qt5 for raspberry, we need to execute a script to fix symlinks and lib paths:
* Clone and init the Qt5 repository:
<br /><code>paulo<code>westeros:<sub>$ cd</sub>/opt/cross-compile-tools<br />paulo</code>westeros:<sub>$ sudo ./fixQualifiedLibraryPaths /mnt/rasp-pi-rootfs/</sub>/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-gcc</code>
</code>paulo@westeros:~/opt$ git clone git://gitorious.org/qt/qt5.git
<br />Go to the qt5/qtbase folder and run:<br /><code>paulo<code>westeros:<sub>/opt/qt5/qtbase$ ./configure -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=</sub>/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf</s> -sysroot /mnt/rasp-pi-rootfs -opensource -confirm-license -optimized-qmake -reduce-exports -release -make libs -prefix /usr/local/qt5pi<br />paulo</code>westeros:<sub>/opt/qt5/qtbase$ make -j 4<br />paulo<code>westeros:</sub>/opt/qt5/qtbase$ sudo make install<code><br />Note: if you want the qmlscene binary you should add -make tools to the ./configure command.
paulo@westeros:~/opt$ cd qt5
paulo@westeros:~/opt/qt5$ ./init-repository<code>
If you're behind a firewall ./init-repository might fail. First run this command:
</code>paulo@westeros:~/opt/qt5$ sed -i 's/git:/https:git./' .gitmodules</code>
Then retry:
<code>paulo@westeros:~/opt/qt5$ ./init-repository -f<code>
 
* Finally, apply a patch on the qtjsbackend repository:
</code>paulo@wseteros:~/opt/qt5$ cd ~/opt/qt5/qtjsbackend
paulo@wseteros:~/opt/qt5/qtjsbackend$ git fetch https://codereview.qt.io/p/qt/qtjsbackend refs/changes/56/27256/4 &amp;&amp; git cherry-pick FETCH_HEAD<code>
 
h2. Compiling qtbase
 
Now the we have all the resources needed to compile qt5 for raspberry, we need to execute a script to fix symlinks and lib paths:
 
</code>paulo@westeros:~$ cd~/opt/cross-compile-tools
paulo@westeros:~$ sudo ./fixQualifiedLibraryPaths /mnt/rasp-pi-rootfs/~/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-gcc<code>
 
Go to the qt5/qtbase folder and run:
</code>paulo@westeros:~/opt/qt5/qtbase$ ./configure -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=~/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf- -sysroot /mnt/rasp-pi-rootfs -opensource -confirm-license -optimized-qmake -reduce-exports -release -make libs -prefix /usr/local/qt5pi
paulo@westeros:~/opt/qt5/qtbase$ make -j 4
paulo@westeros:~/opt/qt5/qtbase$ sudo make install<code>
Note: if you want the qmlscene binary you should add -make tools to the ./configure command.


== Compiling other modules ==
== Compiling other modules ==


Now that you have qmake, you can cross-compile the other modules. To avoid dependencies errors, the following order is sugested:<br />qtimageformats, qtsvg, qtjsbackend, qtscript, qtxmlpatterns, qtdeclarative, qtsensors, qt3d, qtgraphicaleffects, qtjsondb, qtlocation, qtdocgallery.
Now that you have qmake, you can cross-compile the other modules. To avoid dependencies errors, the following order is sugested:
qtimageformats, qtsvg, qtjsbackend, qtscript, qtxmlpatterns, qtdeclarative, qtsensors, qt3d, qtgraphicaleffects, qtjsondb, qtlocation, qtdocgallery.


To compile, you must do like the example below:<br /></code>paulo</code>westeros:<sub>/opt/qt5$ cd qtimageformats<br />paulo<code>westeros:</sub>/opt/qt5/qtimageformats$ /usr/local/qt5pi/bin/qmake .<br />paulo</code>westeros:<sub>/opt/qt5/qtimageformats$ make -j4<br />paulo<code>westeros:</sub>/opt/qt5/qtimageformats$ sudo make install<code>
To compile, you must do like the example below:
</code>paulo@westeros:~/opt/qt5$ cd qtimageformats
paulo@westeros:~/opt/qt5/qtimageformats$ /usr/local/qt5pi/bin/qmake .
paulo@westeros:~/opt/qt5/qtimageformats$ make -j4
paulo@westeros:~/opt/qt5/qtimageformats$ sudo make install<code>


We have all the modules installed in the wheezy image, now we can copy it to the sdcard using dd:<br /></code>paulo</code>westeros:<sub>/opt/qt5$ cd</sub>/opt/<br />paulo<code>westeros:<sub>/opt$ sync; sudo umount /mnt/rasp-pi-rootfs<br />paulo</code>westeros:</sub>/opt$ sudo dd bs=1M if=2012-07-15-wheezy-raspbian.img of=/dev/sdb; sync<br /><code>
We have all the modules installed in the wheezy image, now we can copy it to the sdcard using dd:
</code>paulo@westeros:~/opt/qt5$ cd~/opt/
paulo@westeros:~/opt$ sync; sudo umount /mnt/rasp-pi-rootfs
paulo@westeros:~/opt$ sudo dd bs=1M if=2012-07-15-wheezy-raspbian.img of=/dev/sdb; sync
<code>


obs: Check the entry point of your sdcard. Mine was /dev/sdb.
obs: Check the entry point of your sdcard. Mine was /dev/sdb.
Line 41: Line 88:
'''Notes for OSX'''
'''Notes for OSX'''


* Because your sdcard will be partitioned, OSX won't let you umount it, so you'll need to type:<br /></code>sudo diskutil umountDisk /dev/disk3</code>
* Because your sdcard will be partitioned, OSX won't let you umount it, so you'll need to type:
</code>sudo diskutil umountDisk /dev/disk3</code>


where &quot;disk3&amp;quot; will be the /dev/diskXsY where your sdcard first appeared.
where "disk3" will be the /dev/diskXsY where your sdcard first appeared.


* To perform dd you will need to use the *r*disk index, so if your sdcard is disk3 you will need to type:<br /><code>sudo dd bs=1M if=2012-07-15-wheezy-raspbian.img of=/dev/rdisk3; sync<code>
* To perform dd you will need to use the *r*disk index, so if your sdcard is disk3 you will need to type:
<code>sudo dd bs=1M if=2012-07-15-wheezy-raspbian.img of=/dev/rdisk3; sync<code>


Boot up your pi.
Boot up your pi.
Line 51: Line 100:
== Configuring Qt Creator ==
== Configuring Qt Creator ==


To use Qt Creator properly, you must configure the &quot;Qt Version&amp;quot; and &quot;Tool Chains&amp;quot; sections.
To use Qt Creator properly, you must configure the "Qt Version" and "Tool Chains" sections.


=== Tool Chain Settings ===
=== Tool Chain Settings ===


go to '''Tools <s>&gt; Options..</s>&gt; Build &amp; Run -&gt; Compilers''' tab.<br />click in &quot;'''Add -&gt; GCC'''&quot;.<br />On &quot;'''Compiler Path'''&quot; set to &quot;/home/&amp;lt;you&amp;gt;/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-g+''&quot;.<br />Name it &quot;ARM GCC&amp;quot; or similar.<br />obs: Adjust it to your username.
go to '''Tools -> Options..-> Build &amp; Run -> Compilers''' tab.
<br />h3. Qt Version settings.
click in "'''Add -> GCC'''".
<br />Now go to '''Tools <s>&gt; Options..</s>&gt; Build &amp; Run -&gt; Qt Versions''' tab.<br />Click in &quot;Add..&quot; and choose you qmake for raspberry &quot;/usr/local/qt5pi/bin/qmake&amp;quot;.
On "'''Compiler Path'''" set to "/home/<you>/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-g+''".
<br />'''Note for OSX'''<br />* Because /usr is not visible by default, you first need to open a terminal and type:<br /></code>sudo SetFile -a v /usr</code><br />* After you've completed the qmake selection, if you wish to make /usr invisible again, type the same command with a capital V :<br /><code>sudo SetFile -a V /usr<code>
Name it "ARM GCC" or similar.
<br />h3. Configure Linux Devices
obs: Adjust it to your username.
<br />Go to '''Tools <s>&gt; Options…</s>&gt; Devices -&gt; Devices''' tab.
 
<br />Add a new configuration setting a &quot;Generic Linux Device&amp;quot;<br />Hostname or IP address is the IP of your raspberry<br />user is '''pi'''<br />password is '''raspberry'''<br />obs: if your not did change it.
h3. Qt Version settings.
<br />Now you are ready to run your first Qt raspberry pi project.
 
<br />h2. Example Project
Now go to '''Tools -> Options..-> Build &amp; Run -> Qt Versions''' tab.
<br />You can download a hello world project:<br /></code>paulo</code>westeros:<sub>$ git clone https://git.gitorious.org/qt5-raspberrypi-example/qt5-raspberrypi-example.git</code>
Click in "Add.." and choose you qmake for raspberry "/usr/local/qt5pi/bin/qmake".
<br />Open the project in Qt Creator and go to the Projects pane.<br />Click Manage Kits and then Add.<br />Fill in:<br />Name: Raspberry Pi<br />Device Type: Generic Linux Device<br />Device: Raspberry Pi<br />Compiler: ARM GCC<br />Debugger-&gt;Manage-&gt;Edit-&gt;&quot;/home/&amp;lt;you&amp;gt;/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-gdb&amp;quot; (change your username)<br />Qt version: Qt 5.x.x (qt5pi)<br />Ok-&gt;Add Kit-&gt;Raspberry Pi
 
<br />Then go to the &quot;Rasperry Pi&amp;quot; kit tab-&gt;System Environment and add LD_LIBRARY_PATH which is set to /usr/local/qt5pi/lib
'''Note for OSX'''
<br />Now you can build and run your application from Qt Creator.
* Because /usr is not visible by default, you first need to open a terminal and type:
<br />h2. Troubleshooting
</code>sudo SetFile -a v /usr</code>
<br />h3. Qt version not properly installed
* After you've completed the qmake selection, if you wish to make /usr invisible again, type the same command with a capital V :
<br />You need to keep the SD card image mounted during development!
<code>sudo SetFile -a V /usr<code>
<br />If QtCreator still reports this after mounting the SD card image, then you may need to create the directories missing from  
 
<br /><code>/mnt/rasp-pi-rootfs/usr/local/qt5pi/<code>
h3. Configure Linux Devices
<br />or whatever the mount path is (these will probably include bin, translations, and so on). You can create empty directories using the mkdir command.
 
<br />h3. The default mkspec symlink is broken.
Go to '''Tools -> Options…-> Devices -> Devices''' tab.
<br />It means that mkspec is not found on your sysroot, so your must copy it.
 
<br /></code>paulo</code>westeros:</sub>$ sudo cp -r /usr/local/qt5pi/mkspecs/ /mnt/rasp-pi-rootfs/usr/local/qt5pi/</code>
Add a new configuration setting a "Generic Linux Device"
<br />If the problem persists, create the missing symlink, e.g.
Hostname or IP address is the IP of your raspberry
<br /><code>sudo ln -s /usr/local/qt5pi/mkspecs/devices/linux-rasp-pi-g''+ /usr/local/qt5pi/mkspecs/default<code>
user is '''pi'''
password is '''raspberry'''
obs: if your not did change it.
 
Now you are ready to run your first Qt raspberry pi project.
 
h2. Example Project
 
You can download a hello world project:
</code>paulo@westeros:~$ git clone https://git.gitorious.org/qt5-raspberrypi-example/qt5-raspberrypi-example.git</code>
 
Open the project in Qt Creator and go to the Projects pane.
Click Manage Kits and then Add.
Fill in:
Name: Raspberry Pi
Device Type: Generic Linux Device
Device: Raspberry Pi
Compiler: ARM GCC
Debugger->Manage->Edit->"/home/<you>/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-gdb" (change your username)
Qt version: Qt 5.x.x (qt5pi)
Ok->Add Kit->Raspberry Pi
 
Then go to the "Rasperry Pi" kit tab->System Environment and add LD_LIBRARY_PATH which is set to /usr/local/qt5pi/lib
 
Now you can build and run your application from Qt Creator.
 
h2. Troubleshooting
 
h3. Qt version not properly installed
 
You need to keep the SD card image mounted during development!
 
If QtCreator still reports this after mounting the SD card image, then you may need to create the directories missing from  
 
<code>/mnt/rasp-pi-rootfs/usr/local/qt5pi/<code>
 
or whatever the mount path is (these will probably include bin, translations, and so on). You can create empty directories using the mkdir command.
 
h3. The default mkspec symlink is broken.
 
It means that mkspec is not found on your sysroot, so your must copy it.
 
</code>paulo@westeros:~$ sudo cp -r /usr/local/qt5pi/mkspecs/ /mnt/rasp-pi-rootfs/usr/local/qt5pi/</code>
 
If the problem persists, create the missing symlink, e.g.
 
<code>sudo ln -s /usr/local/qt5pi/mkspecs/devices/linux-rasp-pi-g''+ /usr/local/qt5pi/mkspecs/default<code>


It is probably a good idea to do the same for the sysroot mkspecs.
It is probably a good idea to do the same for the sysroot mkspecs.


=== Include &lt;QtGui/QtGui&amp;gt;: No such file or directory ===
=== Include <QtGui/QtGui>: No such file or directory ===


It seems Qt's include was not found and you must add it to you .pro file:
It seems Qt's include was not found and you must add it to you .pro file:


</code>INCLUDEPATH ''= /mnt/rasp-pi-rootfs/usr/local/qt5pi/include/</code>
</code>INCLUDEPATH ''= /mnt/rasp-pi-rootfs/usr/local/qt5pi/include/</code>
<br />h3. cc1: fatal error: .pch/release-shared/QtGui: No such file or directory
 
<br />Some people have seen this error. Adding the &quot;-no-pch&amp;quot; option when running configure should prevent it.
h3. cc1: fatal error: .pch/release-shared/QtGui: No such file or directory
<br />h3. Getting Could not determine the target architecture! and Could not determine the host architecture!
 
<br />If you are getting this kind of error, it is possible that your current git branch is something other than master. To be sure, do the following:
Some people have seen this error. Adding the "-no-pch" option when running configure should prevent it.
<br /><code>daniel<code>daniel-t3500 : <sub>/opt/qt5/qtbase $ git branch <code>
 
<br />If it shows like this:<br /></code>* (no branch)<br /> master<code>
h3. Getting Could not determine the target architecture! and Could not determine the host architecture!
<br />Then you must checkout to master branch before running ./configure:<br /></code>daniel</code>daniel-t3500 :</sub>/opt/qt5/qtbase $ git checkout master<br />daniel<code>daniel-t3500 : <sub>/opt/qt5/qtbase $ git branch<br />* master</code>
 
<br />It is also good to fetch the latest commits and apply them by doing:<br /><code>daniel<code>daniel-t3500 :</sub>/opt/qt5/qtbase $ git pull<code>
If you are getting this kind of error, it is possible that your current git branch is something other than master. To be sure, do the following:
<br />Also, check for the installation of libz (32 bits) in yor system. In ubuntu (64 bits) you might just:<br /></code>sudo apt-get install lib32z1-dev</code>
 
<br />After the ./configure script has failed first run these commands before restarting ./configure:
<code>daniel@daniel-t3500 : ~/opt/qt5/qtbase $ git branch <code>
<br /><code>daniel<code>daniel-t3500 : <sub>/opt/qt5/qtbase $ git reset —hard<br />daniel</code>daniel-t3500 :</sub>/opt/qt5/qtbase $ git git clean -dxf</code>
 
<br />h3. EGL Error : Could not create the egl surface: error = 0x3000
If it shows like this:
<br />Try allocating more memory to video (try 64 or 128MB). Use the raspi-config utility to change this.
</code>* (no branch)
<br /><code>pi<code>raspberrypi ~ $ sudo raspi-config<code>
master<code>
<br />h3. ABI detection failed
 
<br />You will need Qt Creator 2.6 for Qt5 up to and including beta2.<br />Any Qt 5 later than that will need to use nightly snapshots (or will have to wait for Qt Creator 2.6.1): After the beta2 all libraries were renamed again.
Then you must checkout to master branch before running ./configure:
<br />See &quot;this forum thread for more details&amp;quot;:http://forum.qt.io/viewthread/22023
</code>daniel@daniel-t3500 :~/opt/qt5/qtbase $ git checkout master
<br />h3. ./configure: 2654: ./configure: /home/&amp;lt;you&amp;gt;/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-g: not found -reduce-exports was requested but this compiler does not support it
daniel@daniel-t3500 : ~/opt/qt5/qtbase $ git branch
<br />The error message is totally misleading. The real cause is that the precompile toolchain is 32-bit, so you need to:<br /></code>sudo apt-get install ia32-libs</code>
* master<code>
<br />h3. make: g: Command not found
 
<br />Qt requires a native (non-cross-compiling) copy of g''+ to be installed in order to build qmake. You can't use clang. Fix with:<br /><code>sudo apt-get install g++<code>
It is also good to fetch the latest commits and apply them by doing:
</code>daniel@daniel-t3500 :~/opt/qt5/qtbase $ git pull</code>
 
Also, check for the installation of libz (32 bits) in yor system. In ubuntu (64 bits) you might just:
<code>sudo apt-get install lib32z1-dev<code>
 
After the ./configure script has failed first run these commands before restarting ./configure:
 
</code>daniel@daniel-t3500 : ~/opt/qt5/qtbase $ git reset —hard
daniel@daniel-t3500 :~/opt/qt5/qtbase $ git git clean -dxf<code>
 
h3. EGL Error : Could not create the egl surface: error = 0x3000
 
Try allocating more memory to video (try 64 or 128MB). Use the raspi-config utility to change this.
 
</code>pi@raspberrypi ~ $ sudo raspi-config</code>
 
h3. ABI detection failed
 
You will need Qt Creator 2.6 for Qt5 up to and including beta2.
Any Qt 5 later than that will need to use nightly snapshots (or will have to wait for Qt Creator 2.6.1): After the beta2 all libraries were renamed again.
 
See "this forum thread for more details":http://forum.qt.io/viewthread/22023
 
h3. ./configure: 2654: ./configure: /home/<you>/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-g: not found -reduce-exports was requested but this compiler does not support it
 
The error message is totally misleading. The real cause is that the precompile toolchain is 32-bit, so you need to:
<code>sudo apt-get install ia32-libs<code>
 
h3. make: g: Command not found
 
Qt requires a native (non-cross-compiling) copy of g''+ to be installed in order to build qmake. You can't use clang. Fix with:
</code>sudo apt-get install g++</code>


=== /mnt/rasp-pi-rootfs/usr/lib/arm-linux-gnueabihf/libdl.a(dlopen.o): In function `dlopen': (.text+0xc): undefined reference to `__dlopen' ===
=== /mnt/rasp-pi-rootfs/usr/lib/arm-linux-gnueabihf/libdl.a(dlopen.o): In function `dlopen': (.text+0xc): undefined reference to `__dlopen' ===
Line 121: Line 248:
=== Cannot create forwarding script Betrete 'qtactiveqt'.git/hooks/commit-msg: Datei oder Verzeichnis nicht gefunden ===
=== Cannot create forwarding script Betrete 'qtactiveqt'.git/hooks/commit-msg: Datei oder Verzeichnis nicht gefunden ===


Try:<br /></code>unset LANG<br />./init-repository -f<code>
Try:
<code>unset LANG
./init-repository -f</code>

Revision as of 10:50, 25 February 2015

h1. Beginner's guide to cross-compile Qt5 on RaspberryPi

[toc align_right="yes" depth="2"]

Introduction

This is a step by step guide to help beginners to: cross-compile QT5 for RaspberryPi(wheezy), create, deploy and run an example project. This article will focus on simplicity, so if you are looking for additional customization, please check a more "detailed guide":http://wiki.qt.io/RaspberryPi.

For an easy install, try "this script.":https://gist.github.com/raw/3488286/d1d301946297be999d96df632a0ad0095a4d77e7/bakeqtpi.bash Or get a later version "here":http://gitorious.org/bakeqtpi For help, run

 $ ./bakeqtpi.bash help<code>

== Getting Started ==

First we create a folder to hold the source code and all the required files to do the cross-compilation. We chose to create a directory named "opt" in the home folder:

paulo@westeros:~$ mkdir~/opt paulo@westeros:~$ cd~/opt

Now, download the following files:
* Raspbian Wheezy image from ("here":http://www.raspberrypi.org/downloads):

paulo@westeros:~/opt$ wget http://downloads.raspberrypi.org/raspbian_latest/ -O wheezy-raspbian-latest.zip paulo@westeros:~/opt$ unzip wheezy-raspbian-latest.zip

And mount it:

paulo@westeros:~/opt$ sudo mkdir /mnt/rasp-pi-rootfs paulo@westeros:~/opt$ sudo mount -o loop,offset=62914560 2015-02-16-raspbian-wheezy.img /mnt/rasp-pi-rootfs

* The toolchain built by Donald: (Note, seems to be dead links!)

paulo@westeros:~/opt$ wget https://www.dropbox.com/s/sl919ly0q79m1e6/gcc-4.7-linaro-rpi-gnueabihf.tbz

(or a mirror at http://swap.tsmt.eu/gcc-4.7-linaro-rpi-gnueabihf.tbz with sha1 f6255c6aca925239dc943d22a794f642daa17e65) (or better at http://de.sourceforge.jp/projects/sfnet_rfidmonitor/downloads/crosscompilation-resources/gcc-4.7-linaro-rpi-gnueabihf.tbz as the above noted links seem to be broken)

paulo@westeros:~/opt$ tar -xf gcc-4.7-linaro-rpi-gnueabihf.tbz

Pro tip: don't build your own cross-compiler. You'll overlook something important and loose a couple of hours of your life for nothing. A suitable Raspberry Pi cross-compiler is also available here: https://github.com/raspberrypi/tools

It is a 32-bit build so if you are running on a 64-bit machine (you probably are) you need to install ia32-libs:

paulo@westeros:~/opt$ sudo apt-get install ia32-libs

  • Clone the cross-compile-tools repository:
paulo@westeros:~/opt$ git clone git://gitorious.org/cross-compile-tools/cross-compile-tools.git<code>

* Clone and init the Qt5 repository:

paulo@westeros:~/opt$ git clone git://gitorious.org/qt/qt5.git

paulo@westeros:~/opt$ cd qt5

paulo@westeros:~/opt/qt5$ ./init-repository

If you're behind a firewall ./init-repository might fail. First run this command:

paulo@westeros:~/opt/qt5$ sed -i 's/git:/https:git./' .gitmodules

Then retry:

paulo@westeros:~/opt/qt5$ ./init-repository -f<code>

* Finally, apply a patch on the qtjsbackend repository:

paulo@wseteros:~/opt/qt5$ cd ~/opt/qt5/qtjsbackend paulo@wseteros:~/opt/qt5/qtjsbackend$ git fetch https://codereview.qt.io/p/qt/qtjsbackend refs/changes/56/27256/4 && git cherry-pick FETCH_HEAD

h2. Compiling qtbase

Now the we have all the resources needed to compile qt5 for raspberry, we need to execute a script to fix symlinks and lib paths:

paulo@westeros:~$ cd~/opt/cross-compile-tools paulo@westeros:~$ sudo ./fixQualifiedLibraryPaths /mnt/rasp-pi-rootfs/~/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-gcc

Go to the qt5/qtbase folder and run:

paulo@westeros:~/opt/qt5/qtbase$ ./configure -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=~/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf- -sysroot /mnt/rasp-pi-rootfs -opensource -confirm-license -optimized-qmake -reduce-exports -release -make libs -prefix /usr/local/qt5pi

paulo@westeros:~/opt/qt5/qtbase$ make -j 4

paulo@westeros:~/opt/qt5/qtbase$ sudo make install

Note: if you want the qmlscene binary you should add -make tools to the ./configure command.

== Compiling other modules ==

Now that you have qmake, you can cross-compile the other modules. To avoid dependencies errors, the following order is sugested:
qtimageformats, qtsvg, qtjsbackend, qtscript, qtxmlpatterns, qtdeclarative, qtsensors, qt3d, qtgraphicaleffects, qtjsondb, qtlocation, qtdocgallery.

To compile, you must do like the example below:

paulo@westeros:~/opt/qt5$ cd qtimageformats

paulo@westeros:~/opt/qt5/qtimageformats$ /usr/local/qt5pi/bin/qmake . paulo@westeros:~/opt/qt5/qtimageformats$ make -j4

paulo@westeros:~/opt/qt5/qtimageformats$ sudo make install

We have all the modules installed in the wheezy image, now we can copy it to the sdcard using dd:

paulo@westeros:~/opt/qt5$ cd~/opt/

paulo@westeros:~/opt$ sync; sudo umount /mnt/rasp-pi-rootfs paulo@westeros:~/opt$ sudo dd bs=1M if=2012-07-15-wheezy-raspbian.img of=/dev/sdb; sync

obs: Check the entry point of your sdcard. Mine was /dev/sdb.

'''Notes for OSX'''

* Because your sdcard will be partitioned, OSX won't let you umount it, so you'll need to type:

sudo diskutil umountDisk /dev/disk3

where "disk3" will be the /dev/diskXsY where your sdcard first appeared.

  • To perform dd you will need to use the *r*disk index, so if your sdcard is disk3 you will need to type:
sudo dd bs=1M if=2012-07-15-wheezy-raspbian.img of=/dev/rdisk3; sync<code>

Boot up your pi.

== Configuring Qt Creator ==

To use Qt Creator properly, you must configure the "Qt Version" and "Tool Chains" sections.

=== Tool Chain Settings ===

go to '''Tools -> Options..-> Build &amp; Run -> Compilers''' tab.
click in "'''Add -> GCC'''".
On "'''Compiler Path'''" set to "/home/<you>/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-g+''".
Name it "ARM GCC" or similar.
obs: Adjust it to your username.

h3. Qt Version settings.

Now go to '''Tools -> Options..-> Build &amp; Run -> Qt Versions''' tab.
Click in "Add.." and choose you qmake for raspberry "/usr/local/qt5pi/bin/qmake".

'''Note for OSX'''
* Because /usr is not visible by default, you first need to open a terminal and type:

sudo SetFile -a v /usr

  • After you've completed the qmake selection, if you wish to make /usr invisible again, type the same command with a capital V :
sudo SetFile -a V /usr<code>

h3. Configure Linux Devices

Go to '''Tools -> Options-> Devices -> Devices''' tab.

Add a new configuration setting a "Generic Linux Device"
Hostname or IP address is the IP of your raspberry
user is '''pi'''
password is '''raspberry'''
obs: if your not did change it.

Now you are ready to run your first Qt raspberry pi project.

h2. Example Project

You can download a hello world project:

paulo@westeros:~$ git clone https://git.gitorious.org/qt5-raspberrypi-example/qt5-raspberrypi-example.git

Open the project in Qt Creator and go to the Projects pane. Click Manage Kits and then Add. Fill in: Name: Raspberry Pi Device Type: Generic Linux Device Device: Raspberry Pi Compiler: ARM GCC Debugger->Manage->Edit->"/home/<you>/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-gdb" (change your username) Qt version: Qt 5.x.x (qt5pi) Ok->Add Kit->Raspberry Pi

Then go to the "Rasperry Pi" kit tab->System Environment and add LD_LIBRARY_PATH which is set to /usr/local/qt5pi/lib

Now you can build and run your application from Qt Creator.

h2. Troubleshooting

h3. Qt version not properly installed

You need to keep the SD card image mounted during development!

If QtCreator still reports this after mounting the SD card image, then you may need to create the directories missing from

/mnt/rasp-pi-rootfs/usr/local/qt5pi/<code>

or whatever the mount path is (these will probably include bin, translations, and so on). You can create empty directories using the mkdir command.

h3. The default mkspec symlink is broken.

It means that mkspec is not found on your sysroot, so your must copy it.

paulo@westeros:~$ sudo cp -r /usr/local/qt5pi/mkspecs/ /mnt/rasp-pi-rootfs/usr/local/qt5pi/

If the problem persists, create the missing symlink, e.g.

sudo ln -s /usr/local/qt5pi/mkspecs/devices/linux-rasp-pi-g''+ /usr/local/qt5pi/mkspecs/default<code>

It is probably a good idea to do the same for the sysroot mkspecs.

=== Include <QtGui/QtGui>: No such file or directory ===

It seems Qt's include was not found and you must add it to you .pro file:

INCLUDEPATH = /mnt/rasp-pi-rootfs/usr/local/qt5pi/include/

h3. cc1: fatal error: .pch/release-shared/QtGui: No such file or directory

Some people have seen this error. Adding the "-no-pch" option when running configure should prevent it.

h3. Getting Could not determine the target architecture! and Could not determine the host architecture!

If you are getting this kind of error, it is possible that your current git branch is something other than master. To be sure, do the following:

daniel@daniel-t3500 : ~/opt/qt5/qtbase $ git branch <code>

If it shows like this:

* (no branch) master

Then you must checkout to master branch before running ./configure:

daniel@daniel-t3500 :~/opt/qt5/qtbase $ git checkout master

daniel@daniel-t3500 : ~/opt/qt5/qtbase $ git branch

  • master
    It is also good to fetch the latest commits and apply them by doing:
    
    daniel@daniel-t3500 :~/opt/qt5/qtbase $ git pull

Also, check for the installation of libz (32 bits) in yor system. In ubuntu (64 bits) you might just:

sudo apt-get install lib32z1-dev<code>

After the ./configure script has failed first run these commands before restarting ./configure:

daniel@daniel-t3500 : ~/opt/qt5/qtbase $ git reset —hard daniel@daniel-t3500 :~/opt/qt5/qtbase $ git git clean -dxf

h3. EGL Error : Could not create the egl surface: error = 0x3000

Try allocating more memory to video (try 64 or 128MB). Use the raspi-config utility to change this.

pi@raspberrypi ~ $ sudo raspi-config

h3. ABI detection failed

You will need Qt Creator 2.6 for Qt5 up to and including beta2. Any Qt 5 later than that will need to use nightly snapshots (or will have to wait for Qt Creator 2.6.1): After the beta2 all libraries were renamed again.

See "this forum thread for more details":http://forum.qt.io/viewthread/22023

h3. ./configure: 2654: ./configure: /home/<you>/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-g: not found -reduce-exports was requested but this compiler does not support it

The error message is totally misleading. The real cause is that the precompile toolchain is 32-bit, so you need to:

sudo apt-get install ia32-libs<code>

h3. make: g: Command not found

Qt requires a native (non-cross-compiling) copy of g''+ to be installed in order to build qmake. You can't use clang. Fix with:

sudo apt-get install g++

/mnt/rasp-pi-rootfs/usr/lib/arm-linux-gnueabihf/libdl.a(dlopen.o): In function `dlopen': (.text+0xc): undefined reference to `__dlopen'

You need to run the ./fixQualifiedLibraryPaths again.

See: http://stackoverflow.com/questions/13626726/an-error-building-qt-libraries-for-the-raspberry-pi for more info.

cc1: fatal error: .pch/release-shared/Qt5Gui: No such file or directory

Try adding -no-pch to the ./configure command line.

Cannot create forwarding script Betrete 'qtactiveqt'.git/hooks/commit-msg: Datei oder Verzeichnis nicht gefunden

Try:

unset LANG
./init-repository -f