Forum: Compiler & IDEs QT für ARM unter Ubuntu compilieren. Linker fehler.


von Holger K. (holgerkraehe)


Lesenswert?

Hallo zusammen

Stackoverflow kann euch nicht das Wasser reichen.
Dort gibts nämlich keine Antworten.

Folgendes Problem.
Ich bin nach wie vor dran, QT unter Ubuntu für ARM zu kompilieren.
Also sprich, die Libraries welche dann auf dem Zielsystem zum Einsatz 
kommen. Zielsystem ist ein i.MX6 armv7 Prozessor.

Nun ich gehe grundsätzlich nach diesem Tutorial vor:
http://wiki.qt.io/RaspberryPi_Beginners_Guide

Habe dann aber dank diesem Post: 
Beitrag "Re: glibc mit Linaro toolchain für ARM" endlich mittels dem 
über apt-get install installierten Compiler das Problem mit glibc lösen 
können.

Ich habe dann im ordner qtbase, wie im tutorial gewünsch, ./configure 
aufgerufen.
1
./configure -device linux-imx6-g++ -device-option CROSS_COMPILE=arm-
2
linux-gnueabihf- -sysroot ~/Schreibtisch/LinuxDevelopment/rootfsOverlay 
3
-opensource -confirm-license -optimized-qmake -reduce-exports -release 
4
-make libs -prefix /usr/local/qt5imx -hostprefix /usr/local/qt5imx 
5
-no-opengl

Zuerst ohne -no-opengl dann kam der Fehler "keine Open GL Unterstützung" 
also ohne open GL (wollte ich eh nicht). Dann gings erstmal flott ans 
compilieren.... Sehr lange... Und am ende... Genau! Error!!!
1
qbitarray.o: relocation R_X86_64_32 against `.rodata.str1.8' can not be 
2
used when making a shared object; recompile with -fPIC

Immer wieder diese Meldungen vom Linker. Haufenweise mit verschiedenen 
Objektfiles.

Nun, es irritiert mich, dass da X86_64_32 steht. Ich kompiliere doch für 
ARM? Habe ich da was falsch gemacht?

Wenn ich jetzt einfach blind -fPIC bei den Compilerflags anfüge, dann 
wirds zum totalen Blindflug für mich. Daher frage ich mal hier obs 
überhaupt noch passen kann.

Hier: 
http://stackoverflow.com/questions/22540239/what-would-be-a-pratical-example-of-sysroot-and-prefix-options-for-qt 
werden die Optionen wie -sysroot gut beschrieben. Wie muss das sysroot 
denn aussehen?
Da ich mit Buildroot arbeite, bietet mir Buildroot an, ein overlay zu 
erstellen. Dies ist ein ordner welcher später über das eigentliche 
sysroot kopiert wird. Dies ist elegant um Dateien zu ergänzen. Ich habe 
diesen Overlay ordnert bei sysroot angegeben. Dieser ist grundsätzlich 
leer. Ist das ein Problem?

Danke schonmal

: Bearbeitet durch User
von R. R. (elec-lisper)


Lesenswert?

Holger K. schrieb:
> Wenn ich jetzt einfach blind -fPIC bei den Compilerflags anfüge, dann
> wirds zum totalen Blindflug für mich. Daher frage ich mal hier obs
> überhaupt noch passen kann.

Warum wirds zum totalen Blindflug? PIC klingt jetzt erstmal nicht
verkehrt für ne shared library.

Theoretisch kannst du auch probieren Qt statisch zu übersetzen.
Ist zwar nicht so elegant, und verschwendet später bisschen RAM,
aber lieber statisch als garnicht.

von blubb (Gast)


Lesenswert?

Warum denn selberbauen wenn es schon QT5 fertig als package gibt:
https://archlinuxarm.org/packages/armv7h/qt5-base

https://archlinuxarm.org/platforms/armv7/freescale

von Markus F. (mfro)


Lesenswert?

Da wirst Du schon ein bißchen genauer hingucken müssen, wo genau (bei 
welchem Build-Schritt) der Fehler aufgetreten ist.

Holger K. schrieb:
> qbitarray.o: relocation R_X86_64_32 against `.rodata.str1.8' can not be
> used when making a shared object; recompile with -fPIC

Natürlich sieht das erst mal verkehrt aus: was hat X86-Code in einem 
ARM-Cross-Compilat zu suchen?

Sieht auf den ersten Blick so aus, als ob das Build-Script den falschen 
Compiler verwendet hätte.

Das muß aber nicht unbedingt sein - wenn Qt gebaut wird, müssen ja auch 
die Build-Tools (qmake etc.) gebaut werden, die ja weiterhin auf dem 
Hostsystem laufen sollen. Aus deinem Log-Schnipselchen ist nicht zu 
erkennen, was da gerade hätte passieren sollen, das mußt Du wohl selbst 
rausfinden.

von Rolf M. (rmagnus)


Lesenswert?

Robin R. schrieb:
> Warum wirds zum totalen Blindflug? PIC klingt jetzt erstmal nicht
> verkehrt für ne shared library.

-fPIC ist zwingende Grundvoraussetzung für shared libraries. Alle 
Source-Files, die in eine solche reinkommen, müssen damit übersetzt 
werden. Die Frage ist allerdings, warum qmake das in diesem Fall 
weglässt.

von Holger K. (holgerkraehe)


Lesenswert?

Vielen Dank für eure Antworten.

Ich habe die Lösung gefunden.

Das Problem war nur, dass ich das echte sysroot von Buildroot angeben 
musste und nicht meinen overlay ordner.

Das war dann die korrekte Aufrufe:
1
./configure -device linux-imx6-g++ -device-option CROSS_COMPILE=arm-
2
linux-gnueabihf- -sysroot /opt/buildroot/output/target 
3
-opensource -confirm-license -optimized-qmake -reduce-exports -release 
4
-make libs -prefix /usr/local/qt5imx -hostprefix /usr/local/qt5imx 
5
-no-opengl

Damit hats dann korrekt compiliert.

Ich frage mich nur noch, was ich unter meinem host bei -hostprefix 
/usr/local/qt5imx  finden kann. Da hats ein paar wenige Dateien drinn.

libQT5Bootstrap.a und .prl.
Weiss jemand wozu diese sind?

von Rolf M. (rmagnus)


Lesenswert?

Und ein Bin-Verzeichnis mit ein paar Executables gibt's da nicht? Ich 
würde vermuten, dass diese Lib benutzt wird, um qmake, moc, lupdate 
u.s.w. zu bauen. Diese werden nativ auf deinem build-Rechner benötigt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.