Przy tworzeniu projektu notorycznie otrzymuje błąd duplicate symbol for architecture x86_64. Czy istnieje jakieś narzędzie, które wskaże mi, w którym dokładnie miejscu zachodzi powyższy błąd? Przeszukałem wszystkie pliki projektu i nic nie znalazłem, jakaś randomowa zmiana kolejności wpisów w .pro przyniosła efekt na dwa budowania i problem powrócił.
kompilator/linker podaje pełną wymaganą informację w takich wypadkach (clang jest w tym szczególnie dobry).
Na pewno masz informacje, gdzie są oba egzemplarze zduplikowanego symbolu.
Stawiam na popsuty plik nagłówkowy.
Jasne, że mam. Natomiast wskazuje mi to dwa pliki, w których nie widzę kompletnie tego problemu.
duplicate symbol __Z8getMonthRKNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE in:
format.o
date.o
przed dodaniem do projektu format.h i format.cpp problem nie występował. Include są następujace(plik, include):
month.h - string
month.cpp - month.h
months.h -month.h I array
date.h - months.h
date.cpp - date.h
format.h - date.h
format.cpp - format.h
e: hierarchia dołączeń pokazuje mi czytelnie i nie widzę tam błędu.
Mi clang w takich wpadkach podaje dokładnie linie, w której symbol został zdefiniowany, więc zapewne nie wkleiłeś wszystkiego co jest przydatne.
A problemem jest
getMonth(const std::string&);
http://demangler.com/
Pewnie zdefiniowałeś go w pliku nagłówkowym, który jest dołączany zarówno do format.cpp i date.cpp.
Przenieś definicje do pliku cpp, albo dodaj słowo kluczowe inline
.
Dziękuje bardzo!: )
Swoją drogą, odczytałes z tego:
__Z8getMonthRKNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE in:
pełną nazwę metody? :O
Tenonymous napisał(a):
Dziękuje bardzo!: )
Swoją drogą, odczytałes z tego:
__Z8getMonthRKNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE in:
pełną nazwę metody? :O
Można też użyć narzędzia c++filt i odczytać tak (usunąłem wiodący _).
[pkw@pkwcent ~]$ c++filt _Z8getMonthRKNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE
i uzyskać:
getMonth(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)