Grundlegende Frage zu third party libs beim C++ Cross Compiling
-
Ich habe viel versucht und auch schon in einem speziellen Forum gefragt, allerdings ohne Antwort. Vielleicht kann mir hier ja jemand helfen:
Ich möchte unter Ubuntu x86 für ARM ein C++-Programm übersetzen. Dafür habe ich das Paket arm-linux-gnueabi-g++ installiert. Für kleine Programme ohne weitere Abhängigkeiten funktioniert das auch wunderbar. Nur was mache ich, wenn ich zusätzliche nicht-standard Bibliotheken benötige?
Beispiel: Auf der ARM-Target Maschine installiere ich das Paket postgresql. Jetzt habe ich dadurch zusätzliche Bibliotheken, die auch von meinem Programm verwendet werden, die aber auf meiner x86-er Maschine in der Toolchain fehlen:
/usr/lib/libpq.so
/usr/lib/libpq.a
/usr/lib/arm-linux-gnueabi/libssl.so
/usr/lib/arm-linux-gnueabi/libssl.a
/usr/lib/arm-linux-gnueabi/libkrb5.so.3Wie kann ich diese für den Cross-Compile-Vorgang benötigten Bibliotheken (und header) auf die x86 Maschine bekommen? Zuerst hab ich manuell kopiert, was aber auf Grund der Abhängigkeiten beim Linken unmöglich war
Kann ich die arm-Pakete irgendwie auf der x86 Maschine installieren
-
Meine neuesten Fortschritte:
Es gibt ein Paket dpkg-cross, das soll folgendes machen:
dpkg-cross is intended to make it easier for you to keep your cross
compiling libraries up-to-date, as it works directly on Debian
packages. It saves you copying the libs and headers from a machine with
your target architectureIch bin mir aber nicht sicher, wie ich das Paket benutze. Kopiere ich die *.deb-Packages von meinem Targetsystem zum CrossCompile-System und nutze dann dpkg-cross?
Was ich gemacht habe:
- Postgresql-Paket auf der ARM-Maschine mit Dependency *.debs heruntergeladen
- Auf das CrossCompile-System kopiert
- Dort folgendes ausgeführt: *dpkg-cross -a armhf --install .deb
- Es kam die Meldung "Skipping Multi-Arch package" für einige Pakete. Zwei wurden konvertiert, z.B. "libpq-dev-armhf-cross.9.3.4-1_all.deb"
- Will ich diese direkt installieren (dpkg --install libpq-dev-armhf-cross.9.3.4-1_all.deb) erscheinen Meldungen wie
libpq-dev-armhf-cross depends on libssl-dev-armhf-cross; However: Package libssl-dev-armhf-cross is not configured yet.
Das Paket libssl-dev habe ich aber im Verzeichnis liegen. Wenn ich dpkg-cross mit der Option "--convert-multiarch" zwinge, aller Pakete zu betrachten, dann bekomme ich direkt die Meldung, dass weitere Abhängigkeiten nicht aufgelöst werden können.
Jetzt müsste ich ja wieder händisch die Pakete von der TargetMaschine zusammensuchen und kopieren?! Ich glaub ich hab das Prinzip von dpkg-cross nicht verstanden.
Bitte um Mithilfe
-
Hast du schon in Betracht gezogen einfach das ganze
/usr
zu kopieren? Sollte ja nicht allzu groß sein.
Du könntest auch/
vom ARM-Rechner mit sshfs auf dem x86 irgendwo mounten.
-
Auf sowas wird es wohl hinauslaufen. Ich komme nämlich echt nicht weiter und hab da schon Tage investiert
-
weiss nicht ob dich diese loesung zufriedenstellen wuerde, aber ich erstelle deswegen fast immer eine virtual machine des ganzen und baue damit. es muss ja nur die architektur stimmen, man kann sich mehr ram usw. goennen damit es baut.
vielleicht eine poor man's solution, aber es funzt...
-
rapso schrieb:
weiss nicht ob dich diese loesung zufriedenstellen wuerde, aber ich erstelle deswegen fast immer eine virtual machine des ganzen und baue damit. es muss ja nur die architektur stimmen, man kann sich mehr ram usw. goennen damit es baut.
vielleicht eine poor man's solution, aber es funzt...
So "poor man's" ist das gar nicht. Zumindest arbeite ich auch mit einer virtuellen Maschine. ABER: Das Zielsystem ist ein ARM-System. Dafür gibt es doch gar keine (ubuntu) images?
-
ich weiss ja nicht auf was du cross compilierst (vielleicht ein embeded board?), aber zum bauen muss es ja vielleicht nichts zwingen ubuntu sein.
ich hab z.b. auf dem raspberry pi linux drauf und in meiner VM auf dem PC das gleiche image. (ich glaube das heisst wheezy oder so das auf debian basiert).
-
rapso schrieb:
ich weiss ja nicht auf was du cross compilierst (vielleicht ein embeded board?), aber zum bauen muss es ja vielleicht nichts zwingen ubuntu sein.
ich hab z.b. auf dem raspberry pi linux drauf und in meiner VM auf dem PC das gleiche image. (ich glaube das heisst wheezy oder so das auf debian basiert).
Also vorweg: Ich kann jetzt erfolgreich Cross Compilieren. Wenn man die /lib/ und /usr/lib-Ordner kopiert, dann klappt's auch mit dem Linken.
Aber was mich jetzt brennend interessiert: Der raspberry pi basiert doch auch auf arm? Wie konntest du das image denn in der virtual machine verwenden?
Ich hab das mit einem beaglebone probiert, virtual box hat sich geweigert, das image zu nehmen. Auch ein Konvertierungsversuch des images hatte kein Erfolg gebracht
-
Mit QEMU kannst du Maschinen anderer Architektur emulieren. Das funktioniert mit Binary-Translation und ist auch entsprechend lahmer als die Nutzung bestimmter CPU-Features zur Umsetzung von Virtualisierung. Aber es funktioniert gut, zumindest was ARM anbelangt (das ist wohl das bestgepflegte Emulationstarget in QEMU). Wird zum Beispiel auch in den SDKs vieler Smartphone-Hersteller oder was auch immer genutzt, um Entwicklern das Testen und Debuggen auf einem normalen PC zu ermöglichen.
Mit Virtualbox kommst du da nicht weiter. Das basiert zwar ursprünglich auch auf QEMU, aber selbst wenn der Emulationscode für andere Architekturen noch in der Codebasis enthalten sein sollte, ist er zumindest uralt und ungepeflegt und über das Userinterface eh nicht zu benutzen.
Also QEMU installieren. Wenn du das ganze bequem bedienen können willst, installiere dir auch noch libvirt und den virt-manager. Dort kannst du in halbwegs aktuellen Versionen beim Erstellen einer VM auch die Architektur wählen. Einfach ARM (mit Versatile-Express-Hardwaremodel, das ist so eine Art Referenzhardware/Evalplattform von ARM) wählen und ein geeignetes Systemimage importieren.
Wenn du QEMU ohne libvirt benutzen willst, suchst du nach qemu-system-arm, das du z.B. mit -machine vexpress-a9 aufrufst, um ein Versatile Express mit Cortex-A9-Prozessor zu emulieren. Für den Rest musst du die Dokumentation bemühen.
Gibt noch mehr implementierte Models die mehr oder weniger gut getestet sind. Hängt auch davon ab, mit was das System auf deinem Diskimage klarkommt, ARM ist da etwas komplizierter als ein IBM-PC.
$ qemu-system-arm -version QEMU emulator version 2.0.91, Copyright (c) 2003-2008 Fabrice Bellard
$ qemu-system-arm -machine help Supported machines are: lm3s811evb Stellaris LM3S811EVB canon-a1100 Canon PowerShot A1100 IS vexpress-a15 ARM Versatile Express for Cortex-A15 vexpress-a9 ARM Versatile Express for Cortex-A9 xilinx-zynq-a9 Xilinx Zynq Platform Baseboard for Cortex-A9 connex Gumstix Connex (PXA255) n800 Nokia N800 tablet aka. RX-34 (OMAP2420) lm3s6965evb Stellaris LM3S6965EVB versatileab ARM Versatile/AB (ARM926EJ-S) borzoi Borzoi PDA (PXA270) tosa Tosa PDA (PXA255) cheetah Palm Tungsten|E aka. Cheetah PDA (OMAP310) midway Calxeda Midway (ECX-2000) mainstone Mainstone II (PXA27x) n810 Nokia N810 tablet aka. RX-44 (OMAP2420) terrier Terrier PDA (PXA270) highbank Calxeda Highbank (ECX-1000) cubieboard cubietech cubieboard sx1-v1 Siemens SX1 (OMAP310) V1 sx1 Siemens SX1 (OMAP310) V2 realview-eb-mpcore ARM RealView Emulation Baseboard (ARM11MPCore) kzm ARM KZM Emulation Baseboard (ARM1136) akita Akita PDA (PXA270) z2 Zipit Z2 (PXA27x) musicpal Marvell 88w8618 / MusicPal (ARM926EJ-S) realview-pb-a8 ARM RealView Platform Baseboard for Cortex-A8 versatilepb ARM Versatile/PB (ARM926EJ-S) realview-eb ARM RealView Emulation Baseboard (ARM926EJ-S) realview-pbx-a9 ARM RealView Platform Baseboard Explore for Cortex-A9 spitz Spitz PDA (PXA270) none empty machine virt ARM Virtual Machine collie Collie PDA (SA-1110) smdkc210 Samsung SMDKC210 board (Exynos4210) verdex Gumstix Verdex (PXA270) nuri Samsung NURI board (Exynos4210) integratorcp ARM Integrator/CP (ARM926EJ-S)