Einbinden von Boost in Visual C++ für Linux



  • Hi.

    Ich bin recht neu, was das Programmieren mit C++ betrifft, darum scheitere ich gerade an so etwas einfachem wie dem Einbinden der Boost-Bibliotheken.

    Ich habe Visual Studio 2017 (Community Version) installiert und benutze dabei die Möglichkeit plattformübergreifenden Code für Linux zu compilieren (per ssh Verbindung zur Linux-Maschnine und dort mit g++ compilieren). Funktioniert soweit auch gut, solange ich die Standard-Bibliotheken benutze. Jetzt würde ich aber gern die Boost-Bibliotheken benutzen und scheitere seit 2 Tagen. Und da ich mit googlen nicht mehr weiter komme und alles probiert habe, was ich gefunden habe, hoffe ich, dass mir hier jemand helfen kann (ist mein erster Post hier, ich hoffe das ist nicht der falsche Bereich für meine Frage).

    Ich erstelle ein neues Projekt Konsolenanwendung (Linux). Ich ändere an dem vorgefertigtem Projekt noch nichts außer, dass ich eine include hinzufüge. Sieht dann so aus:

    #include <cstdio>
    #include <boost\asio.hpp>
    
    int main()
    {
        printf("hello from ConsoleApplication1!\n");
        return 0;
    }
    

    Das heisst ich benutze sie noch überhaupt nicht.
    Wenn ich das jetzt aber compiliere, kommt immer der Fehler:
    boost\asio.hpp: No such file or directory

    Habe bei den Projekteigenschaften unter C/C++ --> Allgemein --> Zusätzliche Inludeverzeichnisse D:\c_libraries\boost_1_65_1 hinzugefügt (da hab ich sie entpackt). Im Code selbst funktioniert das auch super. Wenn ich da beim include nur das boost anfange zu schreiben, gibt mir das autovervollständigen auch die entsprechenden dateien zur Wahl, also grundsätzlich erkannt hat er es offensichtlich.

    Hab gedacht, vlt liegt das Problem daran, dass ich die Bibliotheken auf der Linux-Maschnine nicht installiert habe (wobei er benötigte Dateien ja eigtl vor dem compilieren allein kopieren sollte), also hab ich dort auch noch libboost-all-dev installiert, brachte aber keine Änderung.

    Ich habe mittlerweile unzählige Dinge ausprobiert, die ich jetzt unmöglich alle aufzählen kann, aber irgendwo mach ich offensichtlich etwas sehr grundlegendes falsch. Ich wäre froh, wenn mir da jemand helfen kann.

    Achja falls das relevant ist: Ich will keine der Bibliotheken nutzen, die man vorher extra compilieren muss um sie zu verwenden, sondern nur einige der Header-only Bibliotheken von Boost.

    Bin für jeden Tipp dankbar.
    MfG Mario



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Mario86 schrieb:

    D:\c_libraries\boost_1_65_1 hinzugefügt (da hab ich sie entpackt). Im Code selbst funktioniert das auch super ... autovervollständigen

    Nach Entpacken der ZIP-Datei (hier unter Win7) erscheint der Ordner boost_1_65_1 zweimal hintereinander, der boost-Ordner selbst ist dann z.B. zu finden in C:\boost_1_65_1\boost_1_65_1
    Bis mir das aufgefallen ist, gab es hier auch immer den Fehler 'No such file or directory'. Viel mehr kann ich zu boost nicht sagen, da ich nicht damit arbeite. Mit <boost/asio.hpp> gibt es hier auch nur Probleme, aber folg. Mini-Code ist wenigstens fehlerfrei compilierbar:

    #include <boost/cstdlib.hpp>
    #include <boost/locale.hpp>
    using namespace boost::locale;
    
    int main()
    {
        std::cout << "Hello World!" << std::endl;
        return 0;
    }
    


  • Der Fehler mit der nicht gefundenen Datei scheint wohl \ statt / gewesen zu sein. Da Visual Studio das \ automatisch gesetzt hatte, hab ich darüber nicht nachgedacht, nachdem es aber mit deinem code ging und ich beim hinzufügen der asio include wieder den Fehler bekam, dass die Datei nicht vorhanden wäre, fiel mir auf, dass das autoverfollständigen <boost\asio.hpp> benutzte, während deine includes slash statt backslash nutzen.
    Long story short: mit <boost/asio.hpp> bekomme ich zumindest nicht mehr den Fehler, dass die Datei nicht gefunden wird, sondern stattdessen folgende Fehler:

    1>/home/visualstudio/projects/Asiotest/obj/x64/Debug/main.o: In function \_\_static\_initialization\_and\_destruction_0': 1>/usr/include/boost/system/error\_code.hpp:222: undefined reference toboost::system::generic_category()'
    1>/usr/include/boost/system/error_code.hpp:223: undefined reference to boost::system::generic\_category()' 1>/usr/include/boost/system/error\_code.hpp:224: undefined reference toboost::system::system_category()'
    1>/home/visualstudio/projects/Asiotest/obj/x64/Debug/main.o: In function boost::asio::error::get\_system\_category()': 1>/usr/include/boost/asio/error.hpp:224: undefined reference toboost::system::system_category()'
    1>collect2: error: ld returned 1 exit status
    1>G:\asio\Asiotest\Asiotest\obj\x64\Debug\main.o : error :
    1>/usr/include/boost/system/error_code.hpp:222: undefined reference to boost::system : error : generic\_category()' 1>/usr/include/boost/system/error\_code.hpp:223: undefined reference toboost::system : error : generic_category()'
    1>/usr/include/boost/system/error_code.hpp:224: undefined reference to boost::system : error : system\_category()' 1>G:\\asio\\Asiotest\\Asiotest\\obj\\x64\\Debug\\main.o: In functionboost::asio::error: : error :
    1>/usr/include/boost/asio/error.hpp:224: undefined reference to `boost::system : error : system_category()'

    Laut google ist der linker wohl falsch eingestellt, aber nunja, ist auf jeden fall ein komplett anderes Problem als ich eingangs hatte. Danke für deine Hilfe. Ich werd dann mal google genauer befragen, um mein Problem zu lösen. Denn die asio Bibliothek brauch ich für mein Vorhaben unbedingt 😃



  • Um das Thema hier abzuschließen:

    Mittlerweile läuft alles, wie es soll. Ich fasse meine Probleme bzw deren Lösungen beim Einbinden der boost-Bibliotheken hier einmal zusammen, falls später jemand mal ähnliche Probleme hat und den Thread zufällig findet:

    1. Aus irgendeinem Grund, den ich nicht verstehe, mag Visual C++ für Linux es nicht, wenn ihr in den includes backslah benutzt (owbohl das Autovervollständigen die selbst einträgt). Für Dateipfade darum lieber slash nutzen, dann findet er die Dateien auch.

    Also nicht:

    #include <boost\asio.hpp>
    

    sondern:

    #include <boost/asio.hpp>
    

    2. Einige Bibliotheken von Boost funktionieren out of the box, wenn man sie einfach nur dem Include-Verzeichnis hinzufügt. Jedoch gilt das zum Beispiel nicht für asio. Damit diese funktioniert vorher den Command prompt öffnen (nicht den von Windows, sondern den von Visual Studio) und dann im Boostverzeichnis zuerst einmal bootstrap ausführen und dannach .\b2 (dauert etwa 30 min)
    Als ich es im Windows command prompt versuchte, gab es beim Ausführen von bootstrap Fehler (witzigerweise je nachdem welche version von boost man benutzt jedes mal einen anderen Fehler, im Falle von 1.65.1 zum Beispiel c1: fatal error C1083: Datei (Quelle) kann nicht ge”ffnet werden: "yyacc.c": No such file or directory)
    Nachdem das erledigt ist, gibt es in eurem Boost Ordner einen neuen Ordner namens stage. stage/lib dann unter Projekteigenschaften --> Linker --> Allgemein --> zusätzliche Bibiliotheksverzeichnisse hinzufügen.

    Dann klappts auch mit dem asio 😃