C++0x Regex

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Robbiedobbie
  • Registratie: Augustus 2009
  • Laatst online: 16-09 19:30
Ik zit al de hele middag te kloten om de regex library van c++11 te gebruiken, maar ik krijg het maar niet werkend.

Ik heb een kleine testcase opgezet met de volgende code:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
#include <string>
#include <regex>

std::regex pattern("foobar");

int main() {
    std::string str = "foobar";

    std::regex_iterator<std::string::iterator> regexIterator ( str.begin(), str.end(), pattern);

    return 0;
}


De code is obviously nog niet functioneel, echter krijg ik al met deze hoeveelheid code compile problemen. Ik gebruik c++11 (zowel -std=c++11 als -std=gnu++11 geprobeerd als compiler flag) met gcc (GCC) 4.8.2 20140206 (prerelease), maar heb ook clang geprobeerd welke ongeveer dezelfde error geeft. Ik werk in arch linux, en heb daar ook proberen te compilen.

De error:
code:
1
2
test.cpp:(.text+0x106): undefined reference to `std::regex_iterator<__gnu_cxx::__normal_iterator<char*, std::string>, char, std::regex_traits<char> >::regex_iterator(__gnu_cxx::__normal_iterator<char*, std::string>, __gnu_cxx::__normal_iterator<char*, std::string>, std::basic_regex<char, std::regex_traits<char> > const&, std::bitset<11ul>)'
collect2: error: ld returned 1 exit status


Wat mij het geval lijkt, is dat er een library niet beschikbaar is bij het linken. Ik heb zitten googlen, maar kan dus niet vinden welk library dit zou moeten zijn. Bovendien zit het in de c++11 standaard, en zou het dus standaard gelinked moeten worden als ik c++11 enable. Ik heb ook zitten kijken op internet of gcc en clang dit wel ondersteunen, en voor zover ik kan zien doen ze dit wel.

Heeft iemand een idee wat nodig is om dit wel werkend te krijgen?

Alvast bedankt,

Rob

Acties:
  • 0 Henk 'm!

  • Ealanrian
  • Registratie: Februari 2009
  • Laatst online: 19:10
Als ik hier kijk lijkt clang wel te werken en gcc de error te geven.

En volgens SO word het dus niet ondersteund door gcc. werkt een andere lib wel? bijvoorbeeld: http://www.boost.org/doc/...regex/doc/html/index.html

edit: Gcc support vanaf 4.9 wel c++ regexes: http://gcc.gnu.org/gcc-4.9/changes.html

[ Voor 10% gewijzigd door Ealanrian op 21-04-2014 19:48 ]


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Update je gcc-libs, gcc 4.9 heeft hier pas support voor gekregen. Wellicht dat AUR al een package heeft?

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57513

Acties:
  • 0 Henk 'm!

  • Robbiedobbie
  • Registratie: Augustus 2009
  • Laatst online: 16-09 19:30
Ik denk dat ik dan inderdaad maar een andere lib ga gebruiken.
Bij clang geeft hij namelijk de volgende error:
code:
1
2
error: undefined reference to 'std::regex_iterator<__gnu_cxx::__normal_iterator<char const*, std::string>, char, std::regex_traits<char> >::regex_iterator(__gnu_cxx::__normal_iterator<char const*, std::string>, __gnu_cxx::__normal_iterator<char const*, std::string>, std::basic_regex<char, std::regex_traits<char> > const&, std::bitset<11ul>)'
clang: error: linker command failed with exit code 1
met de volgende argumenten:
code:
1
clang++ -std=gnu++11 test.cpp -o test


Aangezien de error bijna hetzelfde is, vermoed ik dat het eerder aan een library ligt wat ik niet goed op het systeem heb.

EDIT:
PrisonerOfPain schreef op maandag 21 april 2014 @ 19:49:
Update je gcc-libs, gcc 4.9 heeft hier pas support voor gekregen. Wellicht dat AUR al een package heeft?

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57513
Gonna try that one first. Als hij niet in de AUR zit compile ik hem zelf wel ;)

[ Voor 20% gewijzigd door Robbiedobbie op 21-04-2014 19:50 ]


Acties:
  • 0 Henk 'm!

  • Ealanrian
  • Registratie: Februari 2009
  • Laatst online: 19:10
Als ik het goed zie is volgens: http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html nog niet alles geimplementeerd, de andere lib zal dus wel een goeie zijn.

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Ealanrian schreef op maandag 21 april 2014 @ 20:04:
Als ik het goed zie is volgens: http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html nog niet alles geimplementeerd, de andere lib zal dus wel een goeie zijn.
Volgens die pagina is alleen regex_traits (transform_primary) nog niet correct in hun mainline.

Acties:
  • 0 Henk 'm!

  • Robbiedobbie
  • Registratie: Augustus 2009
  • Laatst online: 16-09 19:30
PrisonerOfPain schreef op maandag 21 april 2014 @ 20:09:
[...]


Volgens die pagina is alleen regex_traits (transform_primary) nog niet correct in hun mainline.
Echter staat onder kop 7 inderdaad dat bijna alles van regex nog niet implemented is. Beetje dubbel dus :S

Misschien is het uiteindelijk makkelijker om gewoon boost te gaan gebruiken daarvoor, wat wel een erg grote dependency is :(

EDIT: NVM, I was stupic, dat is voor c++14

[ Voor 4% gewijzigd door Robbiedobbie op 21-04-2014 20:14 ]


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Robbiedobbie schreef op maandag 21 april 2014 @ 20:10:
[...]

Echter staat onder kop 7 inderdaad dat bijna alles van regex nog niet implemented is. Beetje dubbel dus :S
Die kop is voor TR1

Acties:
  • 0 Henk 'm!

  • Robbiedobbie
  • Registratie: Augustus 2009
  • Laatst online: 16-09 19:30
Ik was net een ninja edit aan het doen :P Kwam er ook al achter ^^

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom niet gewoon std::sregex_iterator? :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Robbiedobbie
  • Registratie: Augustus 2009
  • Laatst online: 16-09 19:30
Aangezien dat een directe typedef is, en daarmee dezelfde error geeft :(

Acties:
  • 0 Henk 'm!

  • Robbiedobbie
  • Registratie: Augustus 2009
  • Laatst online: 16-09 19:30
In the end, heb ik maar gewoon boost::regex gebruikt. Deze werkte gelukkig wel, zonder verdere wijzigingen :D

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Robbiedobbie schreef op maandag 21 april 2014 @ 20:40:
Aangezien dat een directe typedef is, en daarmee dezelfde error geeft :(
Natuurlijk geeft het dezelfde error, het is een typedef. Mijn punt was dat het schrijven van std::sregex_iterator simpeler is dan het schrijven van std::regex_iterator<std::string::iterator> ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Robbiedobbie
  • Registratie: Augustus 2009
  • Laatst online: 16-09 19:30
.oisyn schreef op dinsdag 22 april 2014 @ 10:04:
[...]

Natuurlijk geeft het dezelfde error, het is een typedef. Mijn punt was dat het schrijven van std::sregex_iterator simpeler is dan het schrijven van std::regex_iterator<std::string::iterator> ;)
True, maar ik had hem juist voluit neergezet, ter verduidelijk vanwege de error die ik erbij kreeg.
Pagina: 1