RaspberryPI Beginners guide: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
 
(Page has moved. Removed duplicate content)
 
(6 intermediate revisions by 3 users not shown)
Line 1: Line 1:
h1. Beginner's guide to cross-compile Qt5 on RaspberryPi
#REDIRECT [[RaspberryPi Beginners Guide]]
 
[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 &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
 
<code> $ ./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 &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>
 
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>
 
* 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
 
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>
<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>
 
* 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>
<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>
<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:
<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>
<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.
 
== 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.
 
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>
 
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>
 
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:<br /></code>sudo diskutil umountDisk /dev/disk3</code>
 
where &quot;disk3&amp;quot; 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>
 
Boot up your pi.
 
== Configuring Qt Creator ==
 
To use Qt Creator properly, you must configure the &quot;Qt Version&amp;quot; and &quot;Tool Chains&amp;quot; sections.
 
=== 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.
<br />h3. Qt Version settings.
<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;.
<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>
<br />h3. Configure Linux Devices
<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.
<br />Now you are ready to run your first Qt raspberry pi project.
<br />h2. Example Project
<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>
<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
<br />Now you can build and run your application from Qt Creator.
<br />h2. Troubleshooting
<br />h3. Qt version not properly installed
<br />You need to keep the SD card image mounted during development!
<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>
<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.
<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>
<br />If the problem persists, create the missing symlink, e.g.
<br /><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.
 
=== Include &lt;QtGui/QtGui&amp;gt;: No such file or directory ===
 
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>
<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.
<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:
<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>
<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>
<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:
<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
<br />Try allocating more memory to video (try 64 or 128MB). Use the raspi-config utility to change this.
<br /><code>pi<code>raspberrypi ~ $ sudo raspi-config<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.
<br />See &quot;this forum thread for more details&amp;quot;:http://forum.qt.io/viewthread/22023
<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
<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>
<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>
 
=== /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:<br /></code>unset LANG<br />./init-repository -f<code>

Latest revision as of 13:57, 24 March 2016