Forum: Compiler & IDEs Frage zu Cross-compilierung


von Joachim X. (transistorschlumpf)


Lesenswert?

Ich habe hier größte Schwierigkeiten ein vernünftiges System ans Laufen 
zu bekommen um Code unter Qt für den Raspi zu schreiben. Sämtliche 
Toolchains die ich fand sind auf die ein oder andere Art wenig 
kompatibel zu meiner Konfiguration.


Kann man auf nem PC (mittels Cross-Compiler) ein Executable für den 
Raspi schreiben, rüberbeamen und dieses ohne das Qt auf dem Raspi 
installiert ist, dort ausführen? Oder braucht's Qt-Dateien z.B. 
(shared-objects?) ?

Beitrag #5744534 wurde von einem Moderator gelöscht.
Beitrag #5744536 wurde von einem Moderator gelöscht.
von Rolf M. (rmagnus)


Lesenswert?

Joachim X. schrieb:
> Ich habe hier größte Schwierigkeiten ein vernünftiges System ans Laufen
> zu bekommen um Code unter Qt für den Raspi zu schreiben. Sämtliche
> Toolchains die ich fand sind auf die ein oder andere Art wenig
> kompatibel zu meiner Konfiguration.

Dann würde ich als erstes den fragen, der deine Konfiguration kennt. Der 
kann vielleicht Aufschluss geben, warum dazu nichts passt.

> Kann man auf nem PC (mittels Cross-Compiler) ein Executable für den
> Raspi schreiben, rüberbeamen und dieses ohne das Qt auf dem Raspi
> installiert ist, dort ausführen? Oder braucht's Qt-Dateien z.B.
> (shared-objects?) ?

Man kann Qt auch statisch linken, dann werden keine weiteren 
Bibliotheken gebraucht. Dann brauchst du aber für deinen Cross-Compiler 
eine statische Version von Qt. Warum kannst du denn nicht einfach Qt auf 
deinem Raspi installieren?

von Joerg W. (joergwolfram)


Lesenswert?

Anfangs hatte ich es auch mit dem Cross-Compiler versucht, aber man 
braucht dazu auch die ganzen Header-Dateien der verwendeten 
Bibliotheken.
Meiner Meinung nach ist es einfacher, ein PI-Image im Qemu laufen zu 
lassen und dort dann "native" zu compilieren. Die benötigten 
Devel-pakete lassen sich ja dort schnell über apt-get installieren.

Jörg

von Joachim X. (transistorschlumpf)


Lesenswert?

Ich hab Qt Creator + Qt5.3 mit Raspian Jessie auf nem Raspi 3B.
Weiterhin hab ich auf der zweiten Sd-Karte Qt Creator mit 5.7.1 auf 
Stretch. Der grüne dreieckige Startbutton startet das Executable aber 
nicht wirklich, es kommt mir so vor als wäre
1
sudo apt-get install qt5-default
2
sudo apt-get install qtcreator
für Cross-compiling forgesehen.


Rolf M. (rmagnus) schrieb:
>Man kann Qt auch statisch linken, dann werden keine weiteren
>Bibliotheken gebraucht. Dann brauchst du aber für deinen Cross-Compiler
>eine statische Version von Qt.
Für diese Linker-Gedöns Einstellungen hab' ich zu wenig Erfahrung...

von Bernd K. (prof7bit)


Lesenswert?

Ich würde auf PC-Seite Docker verwenden um mir eine maßgeschneiderte 
Cross-Build-Umgebung einzurichten. So wäre einerseits auch nach Jahren 
auch auch auf einem neuen PC die Build-Umgebung in Minutenschnelle 100% 
identisch wieder hergestellt und andererseits kontaminierst Du Deinen PC 
nicht mit dutzenden Hilfspaketen und Tools die nur diesem Zweck dienen 
oder gar Paketen mit kniffligen Versionskonflikten, das einzige Paket 
wäre Docker und das ist in 1 Minute installiert und besteht aus purer 
Nützlichkeit.

von Olaf (Gast)


Lesenswert?

> Kann man auf nem PC (mittels Cross-Compiler) ein Executable für den
> Raspi schreiben, rüberbeamen und dieses ohne das Qt auf dem Raspi
> installiert ist, dort ausführen?

Das sollte grundsaetzlich möglich sein. Zum Beispiel indem du einen 
lokal laufenden gdb uebers Netzwerk nutzt. Also im Prinzip das was auch 
Android macht wenn du dafuer mit Qt entwickelst.

Ist aber eine steile Lernkurve weil du natuerlich auf beiden Systemen 
die Libaries brauchst.

Du kannst natuerlich auch Qt auf einem Rhaspberry komplett laufen lassen 
und den Kiste von extern bedienen und einfach das X11 Fenster auf deinem 
Host aufmachen. Allerdings laeuft Qt dann im Gaehn-Modus.

Ich wuerde vielleicht damit anfangen auf beiden Systemen dieselbe 
Qt-Version zu installieren und dann wirklich ueber den Host entwickeln. 
So solltest du die Libarieproblematik weitestgehend umgehen koennen.

Olaf

von Bernd K. (prof7bit)


Lesenswert?

Ein weiterer interessanter Ansatz wäre ein komplettes SD-Karten-Image 
für den Raspi mit Yocto zu bauen, eine maßgeschneiderte Distribution 
komplett automatisch aus den Quellen gebaut die nur die gewünschte 
Anwendung und ihre Abhängigkeiten enthält.

Dieses Buildsystem zu durchschauen und zu beherrschen ist aber auch eine 
harte Nuß, jedoch wenn Du Dich da nach nem halben Jahr halbwegs 
durchgefuchst hast ist das eine nicht zu verachtende Superwaffe im 
Arsenal die Dir bei zukünftigen Embedded Linux Projekten neue Ansätze 
eröffnet.

von BobbyX (Gast)


Lesenswert?

Du kannst das Projekt direkt auf dem Raspberry compilieren. Zuvor musst 
du natürlich alle Tools installieren, das ist aber kein Problem, 
funktioniert ja genauso wie mit Linux auf einem PC. Das Compilieren 
dauert natürlich etwas länger als auf einem PC, aber damit kann man 
leben.

Wenn man ein Qt Projekt für MacOS bauen will dann verwendet man ja auch 
keinen Cross Compiler unter Linux/Windows, sondert man kopiert das 
Projekt auf einen Mac Rechner und baut dort.

von Sven B. (scummos)


Lesenswert?

Olaf schrieb:
>> Kann man auf nem PC (mittels Cross-Compiler) ein Executable für den
>> Raspi schreiben, rüberbeamen und dieses ohne das Qt auf dem Raspi
>> installiert ist, dort ausführen?
>
> Das sollte grundsaetzlich möglich sein. Zum Beispiel indem du einen
> lokal laufenden gdb uebers Netzwerk nutzt. Also im Prinzip das was auch
> Android macht wenn du dafuer mit Qt entwickelst.

Natürlich braucht er auf dem Target die Shared Libraries. Welchen Code 
soll das Target sonst ausführen? Außer du machst irgendein komisches 
Remote-X11-Zeug, was aber nicht wirklich zielführend ist.

> Ich wuerde vielleicht damit anfangen auf beiden Systemen dieselbe
> Qt-Version zu installieren und dann wirklich ueber den Host entwickeln.
> So solltest du die Libarieproblematik weitestgehend umgehen koennen.

Das bringt dir nichts, das Pi ist doch ein arm, und dein Host ist 
x86-64. Du brauchst hier schon eine echte Cross-Toolchain, mit 
arm-target Crosscompiler und den arm Qt-Headern und Libs auf dem Host. 
Du musst auch auf dem Host mit dem Crosscompiler gegen die arm-libs 
linken und so. Einfach kopieren und irgendwie auf beiden Geräten 
ausführen ist nicht.

Im Detail ist das relativ knifflig, weil das ja auch alles gegen die 
glibc des Target-Systems gelinkt werden muss, und die hängt wieder von 
der Kernel-Konfiguration ab ... also wenn du Glück hast, findest du 
irgendwas, was für genau dein Target-System oder etwas hinreichend 
ähnliches ist fertig, aber i.A. muss man sich die Toolchain selbst 
kompilieren.

: Bearbeitet durch User
von Kaj (Gast)


Lesenswert?

Sven B. schrieb:
> Das bringt dir nichts, das Pi ist doch ein arm, und dein Host ist
> x86-64. Du brauchst hier schon eine echte Cross-Toolchain, mit
> arm-target Crosscompiler und den arm Qt-Headern und Libs auf dem Host.
> Du musst auch auf dem Host mit dem Crosscompiler gegen die arm-libs
> linken und so. Einfach kopieren und irgendwie auf beiden Geräten
> ausführen ist nicht.
Was Olaf wohl meinte, war:
Auf PC und Raspi die gleiche Qt installieren, auf PC entwickeln, testen, 
Projekt-Code auf den Raspi kopieren, und da dann eben fuer den Raspi 
compilieren. Das kopieren des Codes ist auch nicht fehleranfaellig, wenn 
man es ueber z.B. git/svn/etc. macht.
Auf PC einchecken wenn es funktioniert, und auf dem Raspi einfach wieder 
auschecken und compilieren. Fertig.

Ist einfacher als sich mit einer Cross-Toolchain rumschlagen.

von Olaf (Gast)


Lesenswert?

> Auf PC und Raspi die gleiche Qt installieren, auf PC entwickeln, testen,
> Projekt-Code auf den Raspi kopieren, und da dann eben fuer den Raspi

Das muss aber natuerlich auch das Projekt zulassen. Gerade bei 
Anwendungen auf dem Raspbery hat man ja haeufig eher hardwarenahe Sachen 
und dann wird man wohl auf dem Zielsystem entwickeln muessen.
Ich hab das vor kurzem mal ausprobiert, komplettes Qt auf einem 3B und 
fand das schon sehr traege.

Olaf

von Bernd K. (prof7bit)


Lesenswert?

Kaj schrieb:
> Ist einfacher als sich mit einer Cross-Toolchain rumschlagen.

Oder einfach ein passendes Docker-Image für die Cross-Toolchain nehmen, 
ich gehe jede Wette ein daß es schon fix und fertige Images oder 
Dockerfiles gibt für den Zweck, dann muss man sich mit gar nichts mehr 
herumschlagen, und man muß auch nicht irgendwelche passenden libs in der 
richtigen Version oder sonstiges Zeugs zusammensuchen und auf dem 
Entwicklungs-PC installieren.

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.