Qt auf Arm LPC2478STK mit uClinux

Verschiedenes zu Qt
Antworten
Tatjana
Beiträge: 4
Registriert: 8. November 2009 10:21

Qt auf Arm LPC2478STK mit uClinux

Beitrag von Tatjana »

Guten Morgen ihr Computer nerds,

da ich am Verzweifeln bin, möchte ich mich an euch wenden.
Mein Prof hat mir ein LPC2478STK Board in die Hand gedrückt und mir die Aufgabe gegeben erstmal eine QT-Applicationen auf diesem LPC zum Laufen zu bekommen und dann .... mal sehen was dann noch kommt.
Benutze QT-4.5.2

Auf dem LPC2478STK läuft ein uClinux. Bin via RS232 und Network verbunden. Alles fine und der LPC2478STK ist auch gehorsam.
On Host funktioniert mit dem virtuellen Frambuffer und der QT-Application alles Bestens.
Spiele dann nur die Application auf den LPC. Wenn ich jedoch die Application auf dem Target starten will bekomme ich:

MyApplication
BINFMT_FLAT: bad header magic
MyApplication: applet not found

Habe folgendes gemacht.
Auf meinem Host führe ich folgendes aus:
im Verzeichnis in der die QT-Application liegt führe ich aus:
qmake -project
qmake
make

Da ich die Application mit dem virtuellen Frambufffer testen kann und alles fine ist, gehe ich einfach mal davon aus, dass der PATH und die LIB beim compilieren richtig genutzt wurde.

Fehlen mir auf dem target die Libs, muss ich die Application mit Optionen starten. PATH setzen oder was mach ich falsch :-( ???
Wie kann ich erreichen, das die Application beim compilieren sämtliche benötigten Libs mit einbindet, sodass ich nur die Application und keine Lib brauche? Geht das überhaupt?
Habe sehr viel im Netz gesucht und verstehe jedoch nicht wann ich etwas einsetzen muss. Was ist z.B. mit -mfdpic oder -Wl,-elf2flt?

Kann mir jemand ein gutes, verständliches Tutorial empfehlen?

Danke euch allen Tatjana
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Zuerst eine doofe Frage (ist deinem Post einfach nicht zu entnehmen): du arbeitest auf deinem Host (Linux/X86?) schon mit einem Cross-Compiler (gcc für ARM), oder? Vielleicht gehst du davon aus, dass dies selbstverständlich ist, aber ich kann nirgendwo lesen, dass du entweder einen compiler selbst erstellt (crosstool), oder vom Board-Hersteller einen mitgeliefert bekommen hast.
On Host funktioniert mit dem virtuellen Frambuffer und der QT-Application alles Bestens.
Meinst du damit in einer virtuellen Maschine (ARM) oder nativ auf dem Host-System (X86)?
Habe sehr viel im Netz gesucht und verstehe jedoch nicht wann ich etwas einsetzen muss. Was ist z.B. mit -mfdpic oder -Wl,-elf2flt?
Ich habe schon eine Weile nicht mehr für Linux/ARM programmiert und kann mich daher nicht mehr an das Flag "-elf2flt" erinnern, aber ein Versuch wär's wert (einfach als Linkerflag mit angeben..).
Fehlen mir auf dem target die Libs, muss ich die Application mit Optionen starten. PATH setzen oder was mach ich falsch
Das ist (noch) nicht das Problem. In diesem Fall würdest du eine entsprechende Fehlermeldung beim Start des Programms bekommen.
Wie kann ich erreichen, das die Application beim compilieren sämtliche benötigten Libs mit einbindet, sodass ich nur die Application und keine Lib brauche? Geht das überhaupt?
Natürlich... du benötigst nur Qt für ARM als static Variante.. danach kannst du statisch Linken... aber da fehlen noch viele Infos von deiner Seite (hast du Qt f. ARM selbst gestrickt oder vom Hersteller bekommen?)
Tatjana
Beiträge: 4
Registriert: 8. November 2009 10:21

Beitrag von Tatjana »

Hallo und danke erstmal für die Antwort,

Also mein Host ist ein Laptop mit Suse 11.0. Ich gehe mal davon aus, dasi QT embeddet den cross-compiler mitliefert. Selber gebastelt habe ich mir nichts.
Habe qt-embedded-linux-opensource-src-4.5.2.tar.gz mit der option
./configure -embedded arm -xplatform qws/linux-arm-g++
installiert.
Wenn ich eine Hello World Application mit QT compiliere, anschließend auf dem Laptop mit ...QT-4.5.2/bin/qvfb einen virtuellen Frambuffer starte und dann die Hello World Application starte funktioniert alles wie sie soll. Der virtuelle Frambuffer soll wohl dazu verwendet werden können um Applicationen auch ohne Zielsystem testen zu können.
Du schreibst, ich soll das Flag "-elf2flt" setzten, aber wie, wo und warum. Sorry, aber mir fehlt da anscheinend noch ganz viel ;-(

Wie kann ich statisch die lib linken?
Was will mir die Fehlermeldung sagen?

MyApplication
BINFMT_FLAT: bad header magic
MyApplication: applet not found

Danke für die Mühe und Zeit!

gruß tatjana
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Ich bin mir immer noch nicht so sicher wie erfahren du bist und wie weit ich ausholen muss..
Die Fakten mal in kürze:

1. für die Embedded-Entwicklung brauchst du einen Crosscompiler, welcher zwar auf deinem Host (Linux/x86) läuft, jedoch Binaries für das Target-System generiert (welche du i.d.R. nicht auf dem Host starten kannst)
2. mit Qt kommt kein solcher Compiler mit (qt-embedded-linux-opensource-src-4.5.2 umfasst aussschliesslich Source-Code, wie der Name schon sagt).
3. Ein Crosscompiler bekommst du entweder
a) vom Board-Hersteller (CD schon geprüft?)
b) von der Community (einschlägige Webseiten geprüft?)
c) selbst gebacken (siehe "crosstool")
4. Beginne OHNE Qt! Ein C/C++-Hello-World muss unbedingt auch so laufen, bevor du dich an die Qt-Umgebung wagst. (Hersteller-Doku, Google, so in etwa http://docs.blackfin.uclinux.org/doku.p ... on_example)

Ich habe ausserdem festgestellt, dass wenn ich die von dir genannte Qt-Version mit dem von dir genannten configure-Aufrufe generiere, kommt eine ganz dezente Warnung während dem Configure:
...
./configure: 6027: arm-linux-g++: not found
Building on: qws/linux-x86-g++
Building for: qws/linux-arm-g++
Architecture: arm
Host architecture: i386
...
Danach generiert mir Qt alles mit dem lokalen gcc und produziert damit ELF/X86 Binaries.. nicht das, was du möchtest...

Lange Rede langer Sinn:
1. Beschäftige dich grundsätzlich mit Crosscompiler (inet, Prof, Literatur (http://oreilly.com/catalog/9780596002220)
2. Besorg dir einen passenden ARM-Compiler
3. nimm ein C/C++ (Qt-frei) Hello-World in Betrieb
3. generiere ein ARM-fähiges Qt
4. ... ;)

Nun noch zu deinen konkreten Fragen:
Was will mir die Fehlermeldung sagen?
Der Loader deines Embeddedsystems versucht, deine Binary zu laden und stellt fest, dass die Magic-Number (eine Identifizierung) nicht stimmt. Was für ein Binary-Format dein Progamm hat, kannst du jederzeit mit "file meinebinary" prüfen (da sollte was mit ARM kommen..)
Wie kann ich statisch die lib linken?
Das sind Programmiergrundlagen: Google/Literatur und Prof darum bemühen.. Qt muss dafür speziell konfiguriert (configure) und generiert werden (Stichwort "Qt static linking").

Ist doch schön wenn man Prof ist... alles zeitaufwendige einfach an die Studenten abschieben :wink:
Tatjana
Beiträge: 4
Registriert: 8. November 2009 10:21

Beitrag von Tatjana »

Gehe zurück zu Start gehe nicht über Los.

Gosh, ich sehe schon ich muss da doch ganz unten anfangen.
Du hast völlig recht, einfach Prof werden und dann darf man kleine Studentinnen quälen.
Egal jetzt!
Deine Hinweise habe mich jetzt jedoch erstmal in eine Richtung geschubst, auf die ich aufbauen kann.
Also:
file FB_Test
FB_Test: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.4, dynamically linked (uses shared libs), not stripped
Scheint genau das zu sein was du vermutet hattest. Intel 80386 sollte dort nicht sehen, oder? Ok, dann weiß ich wo ich ansetzten muss.

Werde dir feedback geben, wenn ich weiter gekommen bin. Muss jetzt noch eine andere Uni-Baustelle bespassen und das kann erstmal 3-4 Wochen dauern. Melde mich dann.

Und DANKE! :lol:

PS: Hoffe, du erkennst nun welche Erfahrung ich habe
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Intel 80386 sollte dort nicht sehen, oder?
Exakt.. für ein ARM Board ist das falsch :wink:
Tatjana
Beiträge: 4
Registriert: 8. November 2009 10:21

Beitrag von Tatjana »

Salü,

bin nicht wirklich weiter gekommen. Hab Qt-embeddet nochmals neu compiliert und anschließend die Application neu erstellt. Nun erhalte ich folgendes:
file workspace/Qt_Hello_world/hello
ELF 32-bit LSB executable, ARM, version 1, for GNU/Linux 2.0.0, dynamically linked (uses shared libs), not stripped

Bekomme jedoch die selber Fehlermeldung wie zuvor:
BINFMT_FLAT: bad header magic
hello: applet not found

Könnt ihr/du mir sagen, ob die Datei erst mal richtig erstellt wurde? Also ob die file-Ausgabe richtig ist für ein LPC2478Stk?

Versuche nun das ganze nochmals mit einer static lib zu erzeugen und will sehen was dann passiert.

Danke und Gruß

Tatjana
Psychomax
Beiträge: 52
Registriert: 29. Dezember 2008 13:28

Beitrag von Psychomax »

Also ich kann mal sagen, wie ich das für den TI OMAP L138 gemacht habe. ist auch ein Arm9.

Ich hab es nach folgender Seite gemacht. Und hat auch bsiher bei jedem Prozessor funktioniert.

http://wiki.omap.com/index.php/Building_Qt

1.) qmake.conf anpassen
2.) passendes configure
3.) crosscompilieren

Standardmässig installiert Qt ja ins /usr/ verzeichnis. Also musst du in dein Filesystem von Embedded System noch die Libs ins gleichnamige Verzeichnis kopieren. Dann noch das Font-Verzeichnis kopieren.

Wenn du magst kann ich dir ein Filesystem vom TI zu kommen lassen.

----

Wenn du jetzt deine eigene Software übersetzen willst gibbt es ein paar Möglichkeiten. Ich habe so gemacht, dass ich im Exampel verzeichnis von Qt ein eigenes Verzeichnis eingerichtet habe und einen PATH auf das BIN Verzeichnis gelegt habe. Dann solltest du qmake nutze können...


Hoffe, dass war einigermaßen verständlich...
LG Max
Antworten