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.3

    Wie 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 architecture

    Ich 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)
    

Anmelden zum Antworten