boost regex problem



  • Hallo zusammen,

    ich versuche gerade unter Windows eine c++ code zu comilieren. dazu nutze ich die qt ide.

    Ich will einfach einen regex, den ich durch die #include <boost/regex.hpp> eingebunden habe prüfen.

    Ich habe mir die neuste stabile version der boost library heruntergeladen.

    allerdings habe ich ein problem. mir wird im compiler ein fehler anfegezit, allerdings weiß ich nicht warum es nicht funktioniert. als ich es mal unter linux kompiliert hatte, ging es einwandfrei:

    #include <string>
    #include <vector>
    #include <boost/algorithm/string.hpp>
    #include <boost/regex.hpp>
    #include <cstring>
    
    using namespace std;
    using namespace boost;
    
    void setMysqlDt(string dt) {
    
        const char *c_dt;
    
        const string srch_patt = "^\\d{4}\\.\\d{2}\\.\\d{2} \\d{2}:\\d{2}:\\d{2}$";
    
        const regex pattern(srch_patt);
    
        dt = trim_copy(dt);
    
        c_dt = dt.c_str();
    
      }
    

    da bekomme ich dann folgende meldung vom compiler zurück:

    C:/Qt/QtCreator/mingw/bin/mingw32-make -f Makefile.Debug
    mingw32-make[1]: Entering directory `C:/Dokumente und Einstellungen//Desktop/sql'
    g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_SQL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"..\..\..\..\Qt\QtCreator\qt\include\QtCore" -I"..\..\..\..\Qt\QtCreator\qt\include\QtCore" -I"..\..\..\..\Qt\QtCreator\qt\include\QtGui" -I"..\..\..\..\Qt\QtCreator\qt\include\QtGui" -I"..\..\..\..\Qt\QtCreator\qt\include\QtSql" -I"..\..\..\..\Qt\QtCreator\qt\include\QtSql" -I"..\..\..\..\Qt\QtCreator\qt\include" -I"c:\Qt\QtCreator\qt\include\ActiveQt" -I"debug" -I"." -I"..\..\..\..\Qt\QtCreator\qt\mkspecs\win32-g++" -o debug\pwdcrypt.o pwdcrypt.cpp
    g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\sql.exe debug/main.o debug/mainwindow.o debug/pwdcrypt.o debug/class_md5.o debug/core_func.inc.o debug/moc_mainwindow.o  -L"c:\Qt\QtCreator\qt\lib" -lmingw32 -lqtmaind -lQtSqld4 -lQtGuid4 -lQtCored4
    debug/pwdcrypt.o: In function `ZSt17__is_null_pointerIN9__gnu_cxx17__normal_iteratorIPKcSsEEEbT_':
    C:/Qt/QtCreator/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_iterator.h:(.text$_ZN5boost11basic_regexIcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE6assignEPKcS7_j[boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::assign(char const*, char const*, unsigned int)]+0x22): undefined reference to `boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::do_assign(char const*, char const*, unsigned int)'
    collect2: ld returned 1 exit status
    mingw32-make[1]: Leaving directory `C:/Dokumente und Einstellungen/anno/Desktop/sql'
    mingw32-make: Leaving directory `C:/Dokumente und Einstellungen/anno/Desktop/sql'
    mingw32-make[1]: *** [debug\sql.exe] Error 1
    mingw32-make: *** [debug] Error 2
    Exited with code 2.
    Error while building project sql
    When executing build step 'Make'
    


  • Bei den meisten Boost-Libraries reicht ein einfaches herunterladen, aber eben nicht bei allen:
    boost::regex muss erst gebaut werden und dagegen muss dann gelinkt werden. Der Linker sagt dir einfach nur dass er eine der Funktionen nicht gefunden hat.
    Wie das mit dem build genau auszusehen hat sagt dir die doku auf boost.org



  • Du kannst auch den Boost Installer runterladen. Ich weiss jetzt nicht, ob es für deine IDE auch geht, aber mit VC++ ist das ganz praktisch, man muss nichts mehr selber einstellen...



  • ist das dann die boost jam datei, der installer?



  • anno schrieb:

    ist das dann die boost jam datei, der installer?

    auch das steht in der Doku



  • pumuckl schrieb:

    anno schrieb:

    ist das dann die boost jam datei, der installer?

    Hm? 🤡

    Nein, irgendwo auf der Boost-Homepage gibts einen Link zu der Installer-Seite. Ich kann dir den jetzt auch nicht gleich geben...



  • Ohh.. Sehr gut:
    http://www.spieleprogrammierer.de/phpBB2/viewtopic.php?t=10842

    Mach das Tutorial mal und sag bescheid, wie du damit zurecht kommst. (oder schreib gleich dort ein Beitrag.. Ansonsten einfach hier posten, ich werde es dann verlinken). Socke braucht dort noch ein paar Versuchskaninchen, ob das ganze auch wirklich Anfängerfreundlich ist. 😉



  • so, diese hilfeseite war mal super. sieht ganz so aus, als ob meine regex library erstellt wurde.

    Allerdigns kamen ab und zu komische meldungen beim kompilieren, finde ich.

    C:/Qt/QtCreator/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5
    /bits/stl_vector.h: In member function `std::vector<_Tp, _Alloc>& std::vector<_T
    p, _Alloc>::operator=(const std::vector<_Tp, _Alloc>&) [with _Tp = boost::sub_ma
    tch<boost::re_detail::mapfile_iterator>, _Alloc = std::allocator<boost::sub_matc
    h<boost::re_detail::mapfile_iterator> >]':
    C:/Qt/QtCreator/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5
    /bits/stl_vector.h:715: warning: '__result' might be used uninitialized in this
    function
    C:/Qt/QtCreator/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5
    /bits/stl_uninitialized.h:82: warning: '__cur' might be used uninitialized in th
    is function
    C:/Qt/QtCreator/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5
    /bits/stl_uninitialized.h:82: warning: '__cur' might be used uninitialized in th
    is function
    C:/Qt/QtCreator/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5
    /bits/stl_uninitialized.h: In member function `void std::vector<_Tp, _Alloc>::_M
    _fill_insert(__gnu_cxx::__normal_iterator<typename _Alloc::pointer, std::vector<
    _Tp, _Alloc> >, size_t, const _Tp&) [with _Tp = boost::sub_match<boost::re_detai
    l::mapfile_iterator>, _Alloc = std::allocator<boost::sub_match<boost::re_detail:
    :mapfile_iterator> >]':
    C:/Qt/QtCreator/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5
    /bits/stl_uninitialized.h:82: warning: '__cur' might be used uninitialized in th
    is function
    C:/Qt/QtCreator/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5
    /bits/stl_uninitialized.h:82: warning: '__cur' might be used uninitialized in th
    is function
    gcc.compile.c++ c:\boost\build\boost\bin.v2\libs\regex\build\gcc-mingw-3.4.5\rel
    ease\link-static\runtime-link-static\fileiter.o
    

    Hier weiß ich jetzt nicht genau, ob das auch fehler waren 😕

    Mit diesen eintellungen habe ich die regex lib erstellt:

    C:\boost\boost_1_34_1>bjam --build-dir=c:\boost\build --toolset=gcc --link=stati
    c --variant=debug --threading=multi --variant=release --with-regex
    

    Jetzt wurden ja einige unterordner erstellt, in denen duzende von dateien liegen. Das ist mal ein Beispiel so eine s ordners:

    C:\boost\build\boost\bin.v2\libs\regex\build\gcc-mingw-3.4.5\debug\link-static
    

    da weiß ich jetzt allerdings nicht richtig, welche dateien ich nehmen soll?

    irgend eine idee?



  • Du machst das besser mit dem install-Flag. Dann werden alle notwendigen Dateien sauber in ein Verzeichnis geschrieben. Etwa so

    bjam gcc --variant=complete "--build-dir=c:\boost\build" "--prefix=c:\boost\build" "-sMINGW_ROOT_DIRECTORY=d:/mingw" --with-regex install

    Das MINGW_ROOT_DIRECTORY kannst du weglassen wenn der Pfad bereits bekannt ist.



  • anno schrieb:

    Hier weiß ich jetzt nicht genau, ob das auch fehler waren 😕

    Wenn du dir die Meldung durchliest (zugegebenerweise etwas mühselig), dann siehst du dass es sich um Warnungen bezüglich uninitialisierter Variablen handelt - allerdings in der STL, so dass du dir darüber nicht unbedingt sorgen zu machen brauchst.

    C:\boost\boost_1_34_1>
    

    Falls du die installation noch nicht fertig haben solltest und Wert auf aktuelle Versionen legst: es gibt bereits Boost 1.37 🙂



  • so, ich habe jetzt mal die euste boost version compiliert. dieses mal wurden .lib dateien erzeugt.

    als ich es dann compilieren wollte, bekam ich nochmals fehelrmeldungen.
    dieses mal allerdings nicht so viele wie das letzte mal.

    Running build steps for project sql...
    Configuration unchanged, skipping QMake step.
    Starting: C:/Qt/QtCreator/mingw/bin/mingw32-make.exe debug -w 
    mingw32-make: Entering directory `C:/Dokumente und Einstellungen/anno/Desktop/sql'
    C:/Qt/QtCreator/mingw/bin/mingw32-make -f Makefile.Debug
    mingw32-make[1]: Entering directory `C:/Dokumente und Einstellungen/anno/Desktop/sql'
    g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\sql.exe debug/main.o debug/mainwindow.o debug/pwdcrypt.o debug/class_md5.o debug/core_func.inc.o debug/moc_mainwindow.o  -L"c:\Qt\QtCreator\qt\lib" -lmingw32 -lqtmaind -lQtSqld4 -lQtGuid4 -lQtCored4
    debug/pwdcrypt.o: In function `ZSt17__is_null_pointerIN9__gnu_cxx17__normal_iteratorIPKcSsEEEbT_':
    C:/Qt/QtCreator/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_iterator.h:(.text$_ZN5boost11basic_regexIcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE6assignEPKcS7_j[boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::assign(char const*, char const*, unsigned int)]+0x22): undefined reference to `boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::do_assign(char const*, char const*, unsigned int)'
    collect2: ld returned 1 exit status
    mingw32-make[1]: Leaving directory `C:/Dokumente und Einstellungen/anno/Desktop/sql'
    mingw32-make: Leaving directory `C:/Dokumente und Einstellungen/anno/Desktop/sql'
    mingw32-make[1]: *** [debug\sql.exe] Error 1
    mingw32-make: *** [debug] Error 2
    Exited with code 2.
    Error while building project sql
    When executing build step 'Make'
    


  • Das ist eine undefined Referenz. Hast du vielleicht vergessen die libs zu deinem Projekt zuzufügen?



  • naja, das kann cshon mögilich sein, aber ich muss erstmal schauen, wie ich die in meine qt greenhouse ide reinbekomme.

    edit:

    muss ich vielleicht die lib datein noch umbennen, denn bisher heißen die "libboost_regex-mgw34-mt-1_37.lib" und "libboost_regex-mgw34-mt.lib"?



  • anno schrieb:

    naja, das kann cshon mögilich sein, aber ich muss erstmal schauen, wie ich die in meine qt greenhouse ide reinbekomme.

    edit:

    muss ich vielleicht die lib datein noch umbennen, denn bisher heißen die "libboost_regex-mgw34-mt-1_37.lib" und "libboost_regex-mgw34-mt.lib"?

    Nein, eigentlich nicht. Aber ein paar heissen immer sehr ähnlich..



  • alles klar, hat wunderbar geklappt.

    ich ahbe in meinem makrfile noch folgende libs eingefügt:

    LIBS += C:\Qt\QtCreator\qt\lib\libboost_regex-mgw34-mt-1_37.lib
    LIBS += C:\Qt\QtCreator\qt\lib\libboost_regex-mgw34-mt.lib
    

    danke dann für die hilfe. ich hoffe es funktioniert jetzt alles, zumindest das comipilieren ging mal.



  • Du brauchst nur die obere.



  • was mich jetzt noch interessieren würde.

    Also wenn ich das richtig verstanden habe, werden die .lib files statisch in das programm eingebunden und dll files wären dann die dynamische variante.



  • Bei boost ist das so, dass überall da wo libboost vorne dran steht, es sich um statische libs handelt. Da brauchst du keine dlls.
    Wenn der Name direkt mit boost beginnt, dann hast du eine lib (zur statischen dll-Bindung) und eine dll.


Anmelden zum Antworten