Discussion:
operator==(std::string, const char*) - undefined symbol
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Tomasz Dołbniak
16 lat temu
Permalink
Witam.

Spotkałem się niedawno z pewnym problemem w pracy. Próbowałem
skompilować pewien kod na solarisie, konkretnie w wersji debug(release
działa bez problemu). Dostałem błąd linkowania takiej treści:

Undefined first referenced
symbol in file
bool std::operator==<char,std::char_traits<char>,std::allocator<char> >
(const std::basic_string<__type_0,__type_1,__type_2>&,const __type_0*)
test.o
ld: fatal: Symbol referencing errors. No output written to a.out

Problem tkwi w tym zapisie:

std::string("AAA") == "AAA"

Problem pojawia się tylko na określonych maszynach(na innych, również
z solarisem, kompilacja przechodzi w obu trybach). Odpowiedni dział
już się tym zajmuje, ale jestem ciekaw co może być przyczyną tego
błędu. A najbardziej ciekawi mnie, dlaczego linker nie może znaleźć
definicji tego operatora tylko w wersji debug. Może ktoś spotkał się z
takim problemem?

Bardziej dokładne informacje o systemie:

$ uname -a
SunOS devsrv25 5.10 Generic_137137-09 sun4u sparc SUNW,SPARC-Enterprise
Maciej Sobczak
16 lat temu
Permalink
Post by Tomasz Dołbniak
Spotkałem się niedawno z pewnym problemem w pracy.
Widziałem podobną sytuację, gdzie kod odwołujący się do jakiegoś
elementu biblioteki standardowej kompilował się ale nie linkował, co
wskazywałoby na niekompletną implementację (coś jest w headerze ale
nie w implementacji).
Niestety praktyka uczy, że jedyną metodą na zachowanie dobrego stanu
zdrowia jest zaakceptować problem jako wrodzoną cechę urody danego
systemu/kompilatora i po prostu danej konstrukcji nie używać.

Jeżeli to jest też Wasz przypadek, to odradzam uleganie pokusie
dopisywania brakujących elementów na własną rękę - wysypie się to
prędzej lub później (odzyskanie systemu z backupu, klon, podobna-ale-
nie-identyczna instalacja u klienta, itd.).
Nadzieją jest natomiast upgrade albo zmiana platformy.

--
Maciej Sobczak * www.msobczak.com * www.inspirel.com
Tomasz Dołbniak
16 lat temu
Permalink
Post by Maciej Sobczak
Post by Tomasz Dołbniak
Spotkałem się niedawno z pewnym problemem w pracy.
Widziałem podobną sytuację, gdzie kod odwołujący się do jakiegoś
elementu biblioteki standardowej kompilował się ale nie linkował, co
wskazywałoby na niekompletną implementację (coś jest w headerze ale
nie w implementacji).
No tak to właśnie wygląda, bo undefined symbol to undefined symbol.
Dziwi mnie tylko, że problem pojawia się przy próbie kompilacji w
trybie debug(czyżby jakiś define w źródłach stl?).
Post by Maciej Sobczak
Niestety praktyka uczy, że jedyną metodą na zachowanie dobrego stanu
zdrowia jest zaakceptować problem jako wrodzoną cechę urody danego
systemu/kompilatora i po prostu danej konstrukcji nie używać.
No ja jestem jak najbardziej za używaniem metody compare(), ale
refaktoryzacja kodu aplikacji, która jest rozwijana od 13 lat to
samobójstwo ;) A niestety wszędzie, gdzie się tylko da string i const
char* są porównywane w sposób leniwy, a więc za pomocą operatora.
Post by Maciej Sobczak
Jeżeli to jest też Wasz przypadek, to odradzam uleganie pokusie
dopisywania brakujących elementów na własną rękę - wysypie się to
prędzej lub później (odzyskanie systemu z backupu, klon, podobna-ale-
nie-identyczna instalacja u klienta, itd.).
Nadzieją jest natomiast upgrade albo zmiana platformy.
No mam nadzieję, że ktoś się tym zajmie. Na szczęście jest to problem
związany z trybem debug, a więc używanym przez developerów, a wersja
finalna(dla klienta) oczywiście wychodzi w release.

Dzięki za opinię.
Darek
16 lat temu
Permalink
Hej,
...
Koledzy z teamu zle spatchowali srodowisko developerskie na tej
maszynie(lub zapomnieli to zrobic).

http://forums.sun.com/thread.jspa?threadID=5388956

Pozdrawiam
Darek Ostolski
Tomasz Dołbniak
16 lat temu
Permalink
Post by Darek
Hej,
Koledzy z teamu zle spatchowali srodowisko developerskie na tej
maszynie(lub zapomnieli to zrobic).
http://forums.sun.com/thread.jspa?threadID=5388956
Super, przekazałem komu trzeba. Dzięki wielkie :)

Loading...