Boost::Filesystem - nichts funktioniert und hab kA warum



  • Hi.

    Mir machen in der Schule gerade ein Projekt in welchem wir ein Programm zur Verwaltung von Musik programmieren. In diesem Programm wollten wir auch eine Suchfunktion einbauen welche auf der Platte nach mp3s sucht. Und genau das macht schon am Anfang nur Probleme.

    Ich hab von der Boost-Seite im Tutorial die Beispiel-Suchfunktion einfach herauskopiert und in ein kleines Test-Programm eingebaut:

    #include "boost/filesystem/operations.hpp" // includes boost/filesystem/path.hpp
    #include "boost/filesystem/fstream.hpp"    // ditto
    #include <iostream.h>                      // for std::cout
    
    using boost::filesystem;                   // for ease of tutorial presentation;
                                               // a namespace alias is preferred in real code
    
    bool find_file (const path & dir_path, const string & file_name, path & path_found)
    {
      if ( !exists( dir_path ) ) return false;
      directory_iterator end_itr; // default construction yields past-the-end
      for ( directory_iterator itr( dir_path );
            itr != end_itr;
            ++itr )
      {
        if ( is_directory( *itr ) )
        {
          if ( find_file( *itr, file_name, path_found ) ) return true;
        }
        else if ( itr->leaf() == file_name ) // see below
        {
          path_found = *itr;
          return true;
        }
      }
      return false;
    }
    
    int main (void)
    {
    path pfad ( "d:\\Mucke" );
    path pfadfund;
    
    find_file(pfad, "03-Lat Oss Ta Allt Fran Varandra.mp3", pfadfund);
    
    cout << pfadfund;
    
    return 0;
    }
    

    Und nun hab ich folgende Probleme. Wenn ich es so wie oben kompiliere kommt nur eine Fehlermeldung: [C++ Fehler] Unit1.cpp(10): E2293 ) erwartet
    Das ist die erste Zeile der Funktion find_file. Ich wüsste nicht wo da eine ) fehlen soll???

    Es kommt aber noch besser: Wenn ich die Funktion find_file auskommentiere und dann compiliere kommen noch viel mehr Fehlermeldungen:
    [C++ Fehler] Unit1.cpp(34): E2451 Undefiniertes Symbol 'path'
    [C++ Fehler] Unit1.cpp(34): E2379 In Anweisung fehlt ;
    [C++ Fehler] Unit1.cpp(35): E2379 In Anweisung fehlt ;
    [C++ Fehler] Unit1.cpp(37): E2268 Aufruf der undefinierten Funktion 'find_file'
    [C++ Fehler] Unit1.cpp(37): E2451 Undefiniertes Symbol 'pfad'
    [C++ Fehler] Unit1.cpp(37): E2451 Undefiniertes Symbol 'pfadfund'

    Das er die Funktion find_file nicht findet ist ja logisch da auskommentiert aber warum er path nicht kennt obwohl es includiert ist versteh ich vorn und hinten nicht. Auch die angeblich fehlenden Semikolons sind doch eindeutig da!!!

    Könnt ihr mir vielleicht weiterhelfen? Ich versteh momentan nur noch Bahnhof 😞

    Gruß Alex



  • Ach ja ich benutze den Borland 6.



  • using namespace boost::filesystem;
    

    Ach ja, es heißt <iostream> und std::cout!



  • Danke, das mit dem Namespace war es. Hab das genau so von dem Tutorial rauskopiert und dachte dadurch das müsste passen. Der Code funktioniert jetzt. Aber leider gibts es nen linker Fehler und ich weis schon nimmer weiter 😞

    [Linker Fataler Fehler] Fatal: Unable to open file 'LIBBOOST_FILESYSTEM-BCB-1_33_1.LIB'

    Diese Datei ist im Boost-Paket nicht vorhanden wodurch er sie auch net finden kann. Was mach ich denn jetzt? Google spukt mir zu der Datei keinen einzigen Treffer raus 😞
    Ich hab die Dateien und Ordner von Boost in den Projekt-Ordner von meinem Programm rein. Müsste doch richtig sein oder?



  • Du müsstest die Boostlib mal kompilieren, ansonsten wirds nix 🙄



  • AxelDozer schrieb:

    Ich hab die Dateien und Ordner von Boost in den Projekt-Ordner von meinem Programm rein. Müßte doch richtig sein oder?

    Nein. Du musst boost auch cmpilieren... Dummkopf...



  • Danke. Das wollte ich jetzt gerade machen. Nur gibts da ein kleines (wie halt immer) Problem.

    Wo krieg ich die bjam.exe her? Wenn ich mich nicht verlesen habe muss ich die auch selber kompilieren und zwar mit build.bat. Aber da passiert einfach nix. Auch wenn ich die option borland mit übergebe erstellt die Batch-Datei nichts.

    Bin nach dieser Seite vorgegangen: http://www.boost.org/tools/build/jam_src/index.html

    Das ist echt zum verrückt werden. Ich checks einfach net 😞
    Kann mir von euch jemand ne Anleitung geben wie es genau geht?
    Muss zugeben ich bin echt zu doof dafür.



  • Man kann die bjam.exe auch fertig runter laden. Und eine Fehlerbeschreibung "tut sich garnichts" ist ja wohl lächerlich.



  • Ja Sorry aber wenn weder was da steht noch etwas erstellt wird und einfach nicht zu merken ist das überhaupt irgendwas gemacht wurde dann find ich "passiert einfach nichts" schon treffend.

    Ich habs jetzt tatsächlich geschafft diese bjam.exe runterzuladen. Unglaublich oder? Ich hoffe den Rest schaff ich ohne wieder nachfragen zu müssen.

    Nochmal vielen Dank für die Antworten!



  • Hallo,

    Auch wenns vielleicht nicht nötig ist, hier man ein Bespiel für einen bjam-Aufruf beim BCB6

    bjam "-sTOOLS=borland" "-sBUILD=debug release <runtime-link>static/dynamic" "-sBCCROOT=c:\Programme\Borland\CBuilder6" install



  • Danke. Den kann ich echt gut gebrauchen. Habs nämlich heut morgen nicht geschafft das ganze zu kompilieren. Hatte ich auch nicht anders erwartet. Diese Boost-Bibliothek macht mich noch total fertig.

    Gruß Alex



  • Naja, das Problem sitzt meistens vor dem Bildschirm. Glaube nicht, das Boost schuld ist. 😉



  • Nene, mir war schon klar das der Fehler mal wieder bei mir liegt 🙂



  • Es tut mir echt leid aber ich komm schon wieder net weiter 😞

    Das ganze kompiliert zwar aber bei vielen Dateien gibts nur Fehlermeldungen:

    Fehler E2401 C:\Dokumente und Einstellungen\Mr. Wolfenstein\Desktop\boost_1_33_1\boost/iostreams/detail/is_iterator_range.hpp 20: Ungültige Template-Argumentliste
    Fehler E2303 C:\Dokumente und Einstellungen\Mr. Wolfenstein\Desktop\boost_1_33_1\boost/iostreams/detail/is_iterator_range.hpp 20: Typname erwartet
    Fehler E2401 C:\Dokumente und Einstellungen\Mr. Wolfenstein\Desktop\boost_1_33_1\boost/range/detail/common.hpp 82: Ungültige Template-Argumentliste
    Fehler E2040 C:\Dokumente und Einstellungen\Mr. Wolfenstein\Desktop\boost_1_33_1\boost/range/detail/common.hpp 83: Deklaration nicht ordnungsgemäß abgeschlossen
    Fehler E2451 C:\Dokumente und Einstellungen\Mr. Wolfenstein\Desktop\boost_1_33_1\boost/range/detail/common.hpp 86: Undefiniertes Symbol 'pair_t'
    Fehler E2228 C:\Dokumente und Einstellungen\Mr. Wolfenstein\Desktop\boost_1_33_1\boost/range/detail/common.hpp 86: Zu viele Fehlermeldungen oder Warnungen
    *** 6 Fehler bei der Compilierung ***
    
    Fatal F1003 C:\Dokumente und Einstellungen\Mr. Wolfenstein\Desktop\boost_1_33_1\boost/filesystem/config.hpp 23: error-Anweisung: Dynamic linking Boost.Filesystem does not work for Borland; use static linking instead
    *** 1 Fehler bei der Compilierung ***
    
    Fehler E2451 C:\Dokumente und Einstellungen\Mr. Wolfenstein\Desktop\boost_1_33_1\boost/wave/util/flex_string.hpp 1171: Undefiniertes Symbol 'Storage' in Funktion position_policy<wave::util::file_position_type>::next_line(wave::util::file_position_type &)
    
    Fehler E2228 C:\Dokumente und Einstellungen\Mr. Wolfenstein\Desktop\boost_1_33_1\boost/wave/cpplexer/cpp_lex_token.hpp 96: Zu viele Fehlermeldungen oder Warnungen
    *** 6 Fehler bei der Compilierung ***
    

    Das sind längst nicht alle. Habs mit der Zeile vom Braunstein versucht. Habs auch mit ein paar eigenen Ideen versucht aber immer dasselbe. Über ne Idee würde ich mich freuen.

    Gruß Alex



  • BCB 6 ist auch ein Uralt Compiler, da kanns schonmal zu fehlermeldungen kommen(afaik wird der bcb6 nicht mehr unterstützt)



  • Das wundert mich jetzt schon. Wenn man nämlich im Getting Startet auf www.boost.org auf Borland klickt steht da:
    Boost.Build's borland toolset supports the Borland C++Builder (BCC 5.5) compiler.

    Deswegen dachte ich fast eher das er zu neu ist. Dann sollte ich es vielleicht mal mit ner älteren Version von Boost versuchen.

    Und wie ist das eigentlich mit Boost.jam. Muss die Version von Jam zu dem Boost-Paket passen? Von den Versionsnummern passen sie ja net zusammen (boost 1.34 Beta und boost-jam 3.1.14)



  • Boost 1.34 ist doch noch garnicht veröffentlicht, nur als Beta und RC.
    Um so neuer der Compiler, um so besser. Die Borland-Compiler werden aber von den Boost-Contributers ungern unterstützt. Teilweise wurde schon diskutiert, ob man diese in Zukunft nicht ganz links liegen lässt. Warum? Weil die Borland-Compiler leider von den Mainstream-Compilern die unkonformsten bzgl. ISO-Norm sind. Wenn sich das in Zukunft nicht bessert (also Codegear mal ordentlich ran klotzt), wird es düster aussehen.

    Eine Frage noch: woher kommen die Meldungen? Benutzt du sie schon in eigenen Projekten? Oder sind die Meldungen alle erstmal vom Boost-Build???

    Warum du aber nicht die Fehlermeldungen abarbeitest, frage ich mich schon. Der hier z.B:

    Fatal F1003 C:\Dokumente und Einstellungen\Mr. Wolfenstein\Desktop\boost_1_33_1\boost/filesystem/config.hpp 23: error-Anweisung: Dynamic linking Boost.Filesystem does not work for Borland; use static linking instead

    Mach doch einfach mal was da steht um das Problem zu beheben! Deutlicher kann eine Fehlermeldung nicht sein. Finde ich zumindest...



  • Jo, die 1.34 is ne Beta. Probiert habs ich aber mit der 1.33. Die Fehlermeldungen sind alle noch vom kompilieren. Die *.lib werden zwar erstellt aber beim Programmablauf stürzt das Programm sofort ab noch bevor die erste Zeile im Main-Programm erreicht wird.

    Das mit Static hab ich schon probiert. Habe als Option "-s" (Static link to runtime.) übergeben. Bin mir aber nicht sicher obs überhaupt die richtige ist. Kenne mich mit dem Compiler-Zeugs net aus und English ist auch net meine Stärke. Aber soweit ich das im Getting Started verstehe macht er doch sowieso Static. Sowas in der Art steht zumindest ganz unten.

    Werde mir das Getting Started heute Abend nochmal genau ankucken. Vielleicht find ich ja noch was.



  • Hallo,

    Also ich habe die boost 1.33.1 mit dem BCB6 (auch mit 5 und BDS2006) mit der bereits angegebenen Kommandozeile übersetzen können. Die config.hpp in filesystem sieht bei mir so aus

    /  boost/filesystem/config.hpp  ---------------------------------------------//
    
    //  © Copyright Beman Dawes 2003
    //  Use, modification, and distribution is subject to the Boost Software
    //  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
    //  http://www.boost.org/LICENSE_1_0.txt)
    
    //  See library home page at http://www.boost.org/libs/filesystem
    
    //----------------------------------------------------------------------------// 
    
    #ifndef BOOST_FILESYSTEM_CONFIG_HPP
    #define BOOST_FILESYSTEM_CONFIG_HPP
    
    // This header implements separate compilation features as described in
    // http://www.boost.org/more/separate_compilation.html
    
    #include <boost/config.hpp>
    
    //  enable dynamic linking on Windows  ---------------------------------------//
    
    #  if (defined(BOOST_ALL_DYN_LINK) || defined(BOOST_FILESYSTEM_DYN_LINK)) && defined(__BORLANDC__) && defined(__WIN32__)
    #    error Dynamic linking Boost.Filesystem does not work for Borland; use static linking instead
    #  endif
    
    #ifdef BOOST_HAS_DECLSPEC // defined in config system
    // we need to import/export our code only if the user has specifically
    // asked for it by defining either BOOST_ALL_DYN_LINK if they want all boost
    // libraries to be dynamically linked, or BOOST_FILESYSTEM_DYN_LINK
    // if they want just this one to be dynamically liked:
    #if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_FILESYSTEM_DYN_LINK)
    // export if this is our own source, otherwise import:
    #ifdef BOOST_FILESYSTEM_SOURCE
    # define BOOST_FILESYSTEM_DECL __declspec(dllexport)
    #else
    # define BOOST_FILESYSTEM_DECL __declspec(dllimport)
    #endif  // BOOST_FILESYSTEM_SOURCE
    #endif  // DYN_LINK
    #endif  // BOOST_HAS_DECLSPEC
    //
    // if BOOST_FILESYSTEM_DECL isn't defined yet define it now:
    #ifndef BOOST_FILESYSTEM_DECL
    #define BOOST_FILESYSTEM_DECL
    #endif
    
    //  enable automatic library variant selection  ------------------------------// 
    
    #if !defined(BOOST_FILESYSTEM_SOURCE) && !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_FILESYSTEM_NO_LIB)
    //
    // Set the name of our library, this will get undef'ed by auto_link.hpp
    // once it's done with it:
    //
    #define BOOST_LIB_NAME boost_filesystem
    //
    // If we're importing code from a dll, then tell auto_link.hpp about it:
    //
    #if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_FILESYSTEM_DYN_LINK)
    #  define BOOST_DYN_LINK
    #endif
    //
    // And include the header that does the work:
    //
    #include <boost/config/auto_link.hpp>
    #endif  // auto-linking disabled
    
    #endif // BOOST_FILESYSTEM_CONFIG_HPP
    

    Ich weiß ehrlich gesagt nicht mehr genau ob ich da was geändert habe.


Log in to reply