Linkererror bei Included lib



  • Hallo mgaeckler,

    um ehrlich zu sein dachte ich, ich hätte dies. Der Aufruf von Netbeans sieht so aus:

    g++     -o dist/Debug/GNU_GCC_477-Linux-x86/testapp build/Debug/GNU_GCC_477-Linux-x86/main.o -L/home/XXXXX/dl2apapter/source/lib/c++/boost_1_57_0/stage/lib -Wl,-rpath,/home/XXXX/dl2apapter/source/lib/c++/boost_1_57_0/stage/lib -Wl,-rpath,../drivers/dl2driver/dist/Debug/GNU_GCC_477-Linux-x86 -L../drivers/dl2driver/dist/Debug/GNU_GCC_477-Linux-x86 -ldl2driver -lboost_system -pthread
    build/Debug/GNU_GCC_477-Linux-x86/main.o: In function `__static_initialization_and_destruction_0':
    /usr/include/boost/system/error_code.hpp:208: undefined reference to `boost::system::get_system_category()'
    /usr/include/boost/system/error_code.hpp:209: undefined reference to `boost::system::get_generic_category()'
    /usr/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::get_generic_category()'
    /usr/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::get_generic_category()'
    /usr/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::get_system_category()'
    

    Mein Boost liegt eigentlich in:

    /home/XXXXX/dl2apapter/source/lib/c++/boost_1_57_0/stage/lib
    

    Er sucht aber in:

    /usr/include/boost
    

    Laut:
    http://stackoverflow.com/questions/1408619/linking-boost-library-in-linux

    2. Antwort ist das der Grund für meinen Fehler. Allerdings verstehe ich nicht, wie er entsteht. 😞 Noch nen Tip für mich?



  • Ich sehe nirgends Deinen Versuch die BOOST Bibliothek einzubinden. Befolge doch einfach die Tipps aus Antwort 1.

    Wie kommst Du darauf, daß der Linker in /usr/include/boost sucht? Ich erkenne keinen Hinweis.

    Mfg Martin



  • Hallo nochmal,

    Hab nicht gesehen, daß Dein Codeausschnitt nach rechts gescrollt werden kann. Jetzt sehe ich Deine ganze Kommandozeile. Daher meine Korrektur:

    Die Bibliothek, die Du benutzt, passt nicht zu den Headers, die eingebunden werden. Möglicherweise hast Du eine alte Version von boost installiert, obwohl eine neuere schon vorhanden ist. Such mal in /usr/lib oder /usr/local/lib, ob da schon eine neuere boost lib vorhanden ist.

    Mfg Martin



  • Hallo mgaeckler,

    danke für deine HIlfe!!! 🙂

    Ja, laut stackoverflow kracht es wohl zwischen der local unter /usr/include ... vorhanden Version von boost, und der von mir angestrebten in /home/XXXXX/dl2apapter/source/lib/c++/boost_1_57_0/stage/lib.

    Ich dachte eigentlich, dass wenn ich per -L... den Pfad angebe nicht weiter auf die System-Bibliotheken zugriffen wird. Benötigt Boost::asio noch mehr als nur system und thread? Mich wundert, dass ich zum bauen der Lib im Prinzip das gleiche gemacht habe, es da aber ohne Probleme durchlief. Mh. 😞 Irgendwo habe ich wohl einen Denkfehler. Leider kann ich auf der Maschine die vorinstallierte Boostversion nicht aktualisieren, da ich keine Adminrechte habe. Daher habe ich die neue Version in mein Home-Folder gelegt. Und den GCC kann ich nur über ein devtoolset von RedHat nutzen. Alles sehr unbefriedigend.

    Ratlos bin ich ein wenig, muss ich zugeben.

    Vielen Dank für deine Hilfe.



  • Das Problem liegt an verschiedenen Versionen deines Headers und deiner Library.
    Loesung:
    Richtige Header UND Library benutzen:

    Mit -L kann du den Suchpfad nach Librarys setzen (bzw. ergaenzen), mit -I kannst du den Suchpfad fuer Header anpassen. Laut manpage wird mit -I auch zuerst in den angegebenen Verzeichnissen gesucht, bevor in den Standardverzeichnissen (/usr/include) nachgesehen wird.
    Die Manpage schweigt zur Suchreihenfolge von -L, aber versuchen kann mans ja mal:

    gcc -L /home/XXXX/pfad/zur/lokalen/boost/distribution/libs -I /home/XXXX/pfad/zur/lokalen/boost/distribution/header
    

    Die einzelnen optionen mussen natuerlich entsprechend angepasst werden.



  • Hallo,

    also im Prinzip mach ich das ja die ganze Zeit schon.

    Hier nochmal mein "Workflow":

    • Starten der SCL Devtoolset 1.1 um den GCC4.7 zu erhalen
    scl enable devtoolset-1.1 tcsh
    
    • wechseln in den Projektpfad und compilen:
    g++ -c -g -std=c++11 -MMD -MP -MF "build/Debug/GNU_GCC_477-Linux-x86/main.o.d" -o build/Debug/GNU_GCC_477-Linux-x86/main.o main.cc
    

    keine Fehler

    • Linken:
    g++ -o testapp build/Debug/GNU_GCC_477-Linux-x86/main.o -L/home/XXXXX/dl2apapter/source/lib/c++/boost_1_57_0/stage/lib -ldl2driver -lboost_system -pthread -I/home/XXXXXX/dl2apapter/source/lib/c++/boost_1_57_0 -L/home/XXXXXXX/projects/DL2Adapter/source/dl2adapter/drivers/dl2driver
    

    Dies endet mit:

    build/Debug/GNU_GCC_477-Linux-x86/main.o: In function `__static_initialization_and_destruction_0':
    /usr/include/boost/system/error_code.hpp:208: undefined reference to `boost::system::get_system_category()'
    /usr/include/boost/system/error_code.hpp:209: undefined reference to `boost::system::get_generic_category()'
    /usr/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::get_generic_category()'
    /usr/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::get_generic_category()'
    /usr/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::get_system_category()'
    build/Debug/GNU_GCC_477-Linux-x86/main.o: In function `boost::asio::error::get_system_category()':
    /usr/include/boost/asio/error.hpp:218: undefined reference to `boost::system::get_system_category()'
    collect2: error: ld returned 1 exit status
    

    Vielen Dank für Eure Hilfe. Mittlerweile bin ich sehr gefrustet. Da tut das gut. 😉

    vg



  • Nochmal schöner im Format die Befehlszeile:

    g++ -o testapp build/Debug/GNU_GCC_477-Linux-x86/main.o 
        -L/home/XXXXX/dl2apapter/source/lib/c++/boost_1_57_0/stage/lib 
        -ldl2driver 
        -lboost_system 
        -pthread 
        -I/home/XXXXX/dl2apapter/source/lib/c++/boost_1_57_0 
        -L/home/XXXX/projects/DL2Adapter/source/dl2adapter/drivers/dl2driver
    

    Die Reihenfolge der Parameter ändert nix.



  • Und wie übersetzt Du dl2driver? Da mußt Du wahrscheinlich auch den korrekten Includepfad zu Deiner BOOST installation angeben.

    Mfg Martin



  • sven_ schrieb:

    g++ -c -g -std=c++11 -MMD -MP -MF "build/Debug/GNU_GCC_477-Linux-x86/main.o.d" -o
    

    So laeuft das eben nicht. Wo kommen hier denn die Boostheader her? Aus /usr/include.
    Diese willst du aber nicht. Du musst auch hier den eigentlichen Includepfad angeben.

    g++ -c -g -std=c++11 -IPFAD -MMD -MP -MF "build/Debug/GNU_GCC_477-Linux-x86/main.o.d" -o 
                          ^^^^^
                      Hier anpassen
    

    (Edit: es muss natuerlich -I (grosses i), nicht -L heissen)

    Was bei der passiert:
    Du benutzt einen alten Boost-Header, dieser deklariert eine Funktion get_system_categorie.
    Dann linkst du dazu eine Bibliothek, du brauchst ja die Definition der Funktion. Da aber get_system_categorie, wie ich das verstehe, in neueren Versionen von Boost nicht mehr vorhanden ist, kann der Linker diese Funktion nicht finden. Daher musst du entweder die aeltere Bibliothek nehmen, oder die aktuelle Headerdatei. Momentan mischst du beide, das kann nicht funktionieren.



  • Hallo zusammen,

    es TUT!!!!! VIELEN DANK!!!! Boah. Das war ne schwere Geburt. So genau blicke ich es immer noch nicht, wo der Fehler nun war, aber ok.

    Ich baue jetzt beides so:

    Treiber

    g++    -c -g 
           -I/home/XXXXXXX/projects/DL2Adapter/source/lib/c++/boost_1_57_0 
           -I/home/XXXXXXX/projects/DL2Adapter/source/lib/c++/boost_1_57_0/boost/asio 
           -std=c++11 
           -fPIC  
           -MMD 
           -MP 
           -MF "build/Debug/GNU_GCC_477-Linux-x86/src/DL2.o.d" 
           -o build/Debug/GNU_GCC_477-Linux-x86/src/DL2.o src/DL2.cc
    
    g++    -o dist/Debug/GNU_GCC_477-Linux-x86/libdl2driver.so 
           build/Debug/GNU_GCC_477-Linux-x86/src/DL2.o 
           -L/home/XXXXXXX/projects/DL2Adapter/source/lib/c++/boost_1_57_0/stage/lib 
           -Wl,-rpath,/home/XXXXXXX/projects/DL2Adapter/source/lib/c++/boost_1_57_0/stage/lib 
           -lboost_system 
           -shared 
           -fPIC
    

    TestApp

    g++    -c -g 
           -I/home/XXXXXXX/projects/DL2Adapter/source/lib/c++/boost_1_57_0 
           -std=c++11 
           -MMD 
           -MP 
           -MF "build/Debug/GNU_GCC_477-Linux-x86/main.o.d" 
           -o build/Debug/GNU_GCC_477-Linux-x86/main.o main.cc
    
    g++    -o dist/Debug/GNU_GCC_477-Linux-x86/testapp 
           build/Debug/GNU_GCC_477-Linux-x86/main.o 
           -L/home/XXXXX/projects/DL2Adapter/source/lib/c++/boost_1_57_0/stage/lib 
           -Wl,-rpath,/home/XXXXXX/projects/DL2Adapter/source/dl2adapter/drivers/dl2driver/dist/Debug/GNU_GCC_477-Linux-x86 
           -L/home/XXXXXXXX/projects/DL2Adapter/source/dl2adapter/drivers/dl2driver/dist/Debug/GNU_GCC_477-Linux-x86 
           -ldl2driver 
           -lboost_system
    

    Kann es sein, dass das "doppelte" Include es gebracht hat?

    -I/home/XXXXXXX/projects/DL2Adapter/source/lib/c++/boost_1_57_0 
           -I/home/XXXXXXX/projects/DL2Adapter/source/lib/c++/boost_1_57_0/boost/asio
    

    Auf jeden Fall riesen Dank an Eure Hilfe. Das hätte ich ohne Euch vermutlich nicht so schnell geschafft. Danke!! 😃 👍



  • sven schrieb:

    Kann es sein, dass das "doppelte" Include es gebracht hat?

    -I/home/XXXXXXX/projects/DL2Adapter/source/lib/c++/boost_1_57_0 
           -I/home/XXXXXXX/projects/DL2Adapter/source/lib/c++/boost_1_57_0/boost/asio
    

    Nein.

    Was du hier machst, ist auch keine gute Idee. Jemand, der boost::asio nutzt, wird normalerweise

    #include <boost/asio.hpp
    #include <boost/asio/special_asio_header_needed.hpp
    

    schreiben. Durch dein zweites -I kann man auch einfach direkt special_asio_header_needed.hpp einbeinden. Gute idee? Naja, ich weiss nicht. Schadet aber auch nicht.


Anmelden zum Antworten