Linkererror bei Included lib
-
Hallo zusammen,
ich baue gerade eine Netbeans-Projektstruktur auf, welche einen Treiber und eine Testanwendung in getrennten Projekten umfasst. Ich habe ein Projekt, welches eine Library mit boost::aio baut, DL2Driver. Dann habe ich eine Testprojekt, welches diese Library nutzt, Testapp. Wenn ich die Library baue, ist alles fein. Dann will ich die Testapp bauen (welche einfach nur ein Library Objekt anlegt). Compilen geht ohne Probleme, aber beim Linken bekomme ich:
Die Library ist dl2driver, die Testapp ist testapp

g++ -o dist/Debug/GNU_GCC_477-Linux-x86/testapp build/Debug/GNU_GCC_477-Linux-x86/main.o -Wl,-rpath,../drivers/dl2driver/dist/Debug/GNU_GCC_477-Linux-x86 -L../drivers/dl2driver/dist/Debug/GNU_GCC_477-Linux-x86 -ldl2driver 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()' ...Warum will er beim Linken nun Boost? Die Testapp als solches nutzt Boost nicht, nur der DL2Driver per boost::aio. Muss ich nun der Testapp noch das include Verzeichnis von Boost hinzufügen? Kann mir da jemand auf die Sprünge helfen?
Vielen Dank.
sven
-
Das includeverzeichnis ist nicht erforderlich, sonst hättest Du schon beim Compilieren Probleme bekommen. Aber die Bibliotheksdatei von Boost must Du natürlich angeben.
Mfg Martin
-
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/libEr sucht aber in:
/usr/include/boostLaut:
http://stackoverflow.com/questions/1408619/linking-boost-library-in-linux2. 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/headerDie 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.cckeine 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/dl2driverDies 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 statusVielen 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/dl2driverDie 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" -oSo 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 -fPICTestApp
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_systemKann 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/asioAuf 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/asioNein.
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.hppschreiben. 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.