GeographicLib lässt sich mit g++ nicht linken

  • Moin!


    Nach einem Upgrade von Raspbian Jessie auf Buster kann ich meine in C++ geschriebene App nicht mehr kompilieren, weil der Linker mit der Bibliothek GeographicLib nicht klarkommt und reproduzierbar so einen Fehler auswirft:

    Code
    /usr/bin/arm-linux-gnueabihf-ld: main.o: in function `OnDisplayGPSTimerElapsed(P
    oco::Util::TimerTask&)': 
    /import/valen/autoradio/main.cpp:349: undefined reference to `GeographicLib::DMS
    ::Encode[abi:cxx11](double, GeographicLib::DMS::component, unsigned int, Geograp
    hicLib::DMS::flag, char)' 
    /usr/bin/arm-linux-gnueabihf-ld: /import/valen/autoradio/main.cpp:358: undefined
    reference to `GeographicLib::DMS::Encode[abi:cxx11](double, GeographicLib::DMS:
    :component, unsigned int, GeographicLib::DMS::flag, char)' 
    collect2: error: ld returned 1 exit status

    Nachforschungen ergaben, dass GeographicLib offenbar mit einem deutlich älteren g++ kompiliert wurde:

    Code
    pi@autoradio:/usr/lib $ strings -a libGeographic.so.17.1.1 |grep "GCC: ("        
    GCC: (Raspbian 4.9.2-10) 4.9.2 
    pi@autoradio:/usr/lib $ g++ --version 
    g++ (Raspbian 6.5.0-1+rpi1+b1) 6.5.0 20181026


    Ich habe etwas von einer Änderung bei den Binärschnittstellen ab g++ 5.1 gelesen, weswegen mit frischeren Compiler-Versionen gegorene Programme mitunter ein Problem mit Bibliotheken haben, die man noch mit einem älteren Compiler fabriziert hat. :@


    Was mache ich da? Der Verantwortliche für das Paket hat den Verdacht, ich hätte hier ein Debian/ARM-Paket auf Raspbian installiert, was aber falsch ist, denn ich habe das Paket via apt-get install bezogen. Was meint Ihr?


    Danke und (für die 92 Minuten Rest-Fasching) ein Hinein und he geiht!

    • Official Post

    Der Verantwortliche für das Paket hat den Verdacht, ich hätte hier ein Debian/ARM-Paket auf Raspbian installiert, was aber falsch ist

    Hat der Verantwortliche für das Paket dieses auch mit Buster getestet?


    Ich habe zwar keinen Plan (mehr) von dem C-Kram, aber mir kommt folgendes irgendwie "nicht richtig" vor:

    Nach einem Upgrade von Raspbian Jessie auf Buster


    Vielleicht ging dort irgendwas nicht so wie es sollte, aber wie geschrieben rate ich nur. :daumendreh2:

    Hast Du es mal mit einem frischen Buster probiert, ob der Fehler damit auch kommt?

  • Ohne eine Angabe der vollständigen Compiler-Optionen ist das kaum zu beurteilen. Es sieht danach aus, dass Du eine Funktion bzw. Klasse aufrufen willst, die nicht deklariert ist.

    Ich würde mindestens als Optionen für den g++ diese setzen: -Wall -Wextra

    Mein Github-Repository ist hier zu finden.

  • OK, ich hab's raus: Ich hatte zwei verschiedene Versionen der Biblio (17.1.1 und 17.1.2) auf dem Raspi, allerdings in verschiedenen Ordnern, und der Ordner mit der älteren Version stand im LDPATH weiter vorne! Mit diesem LDPATH klappte es:

    Code
    LDPATH=/usr/lib/arm-linux-gnueabihf:/usr/lib