2010-02-03 12 views
6

Mam bibliotekę statyczną, którą zbudowałem przy pomocy MinGW, próbuję połączyć z tą biblioteką z aplikacji Qt. Wciąż dostaję błędy linkera spowodowane przez jeden z plików obiektowych w bibliotece. Ten plik faktycznie deklaruje kilka nagłówków Boost, jeden do użycia shared_ptr i drugi, dzięki czemu mogę uczynić klasę noncopyable. Uważam, że używanie tej funkcji zwiększania jest przyczyną problemu, ale nie mam pojęcia, dlaczego. Jeśli skomentuję klasy w aplikacji Qt, które używają klasy zdefiniowanej w pliku, aplikacja Qt łączy się dobrze. Jest to część błąd wyjścia:Niezdefiniowane odniesienia podczas próby połączenia aplikacji Qt z moją biblioteką statyczną

C: \ bla \ budować \ windows \ MinGW \ libfoo.a (foo_ctis.cpp.obj). Foo_ctis.cpp :(tekst + 0x10a): niezdefiniowany odniesienie do `__gxx_personality_sj0'

C: \ bla \ budować \ windows \ MinGW \ libfoo.a (foo_ctis.cpp.obj): foo_ctis.cpp :(tekstu + 0x12f). niezdefiniowana odniesienia do ` _Unwind_SjLj_Register "

C: \ bla \ budować \ windows \ MinGW \ libfoo.a (foo_ctis.cpp.obj). foo_ctis.cpp :(tekst + 0x203): niezdefiniowana odniesienia do `_Unwind_SjLj_Resume '

C: \ bla \ budować \ windows \ MinGW \ libfoo.a (foo_ctis.cpp.obj). Foo_ctis.cpp :(tekst + 0x20e): niezdefiniowana odniesienia do ` _Unwind_SjLj_Unregister'

C: \ bla \ budować \ windows \ MinGW \ libfoo.a (foo_ctis.cpp.obj): foo_ctis.cpp :(tekst + 0x226). niezdefiniowana odniesienia do `__gxx_personality_sj0'

C: \ blah \ build \ windows \ mingw \ libfoo.a (foo_ctis.cpp.obj): foo_ctis.cpp :(. text + 0x24b): niezdefiniowane odniesienie do `_Unwind_SjLj_Register '

C: \ bla \ budować \ windows \ MinGW \ libfoo.a (foo_ctis.cpp.obj). Foo_ctis.cpp :(tekst + 0x31f): niezdefiniowana odniesienia do `_Unwind_SjLj_Resume”

C : \ bla \ budować \ windows \ MinGW \ libfoo.a (foo_ctis.cpp.obj): foo_ctis.cpp :(tekstu + 0x32a). niezdefiniowana odniesienia do `_Unwind_SjLj_Unregister”

C: \ bla \ build \ windows \ mingw \ libfoo.a (foo_ctis.cpp.obj): foo_ctis.cpp :(. text $ _ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_ [boost :: szczegóły :: shared_count :: shared_count (foo :: foo_SomeClassImpl *)] + 0xc): undefined odniesienie do `__gxx_personality_sj0'

C: \ bla \ budować \ windows \ MinGW \ libfoo.a (foo_ctis.cpp.obj). foo_ctis.cpp :(tekst $ _ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_ [boost :: :: shared_count szczegół: : shared_count (foo :: foo_SomeClassImpl *)] + 0x31): niezdefiniowana odniesienia do `_Unwind_SjLj_Register”

C: \ bla \ budować \ windows \ MinGW \ libfoo.a (foo_ctis.cpp.obj): foo_ctis. CPP :(tekst $ _ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_ [boost :: detal :: shared_count :: shared_count (foo :: foo_SomeClassImpl *)] + 0xfb). niezdefiniowana odniesienia do `_Unwind_SjLj_Resume”

C: \ blah \ build \ windows \ mingw \ libfoo.a (foo_ctis.cpp.obj): foo_ctis.cpp :(.tekst $ _ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_ [boost :: detal :: shared_count :: shared_count (foo :: foo_SomeClassImpl *)] + 0x106): niezdefiniowana odniesienia do `collect2 _Unwind_SjLj_Unregister”: ld powrócił 1 exit status

jednego z pozostałych trzeba wspomnieć, że używam wskaźnika do implementacji w tej klasie. Każda pomoc byłaby mile widziana.

Rozwiązane: Stwierdziłem, że mam starszą wersję GCC na mojej ścieżce, która została dołączona przed moją dostarczoną przez MinGW wersją GCC. Stara wersja była zawarta w pakiecie GNUStep, który miałem od jakiegoś czasu. Myślę, że konfiguracja tych różnych wersji powodowała problemy. Dzięki kemiisto, który był na właściwej drodze do rozwiązania problemu.

Odpowiedz

3

Wygląda na to, że twoja biblioteka statyczna została połączona z jedną dystrybucją MinGW (trzecia wersja), ale próbujesz połączyć swoją aplikację z tą biblioteką za pomocą innej dystrybucji MinGW (tj. Czwartej wersji, która jest dystrybuowana z binarną Qt). Powinieneś odbudować bibliotekę przy użyciu tego samego MinGW, którego używasz do tworzenia aplikacji.

Aktualizacja

Może być to kolejny dobrze znany problem. Spójrz na this topic. Prawdopodobnie masz 2 różne foldery z Qt libs

C:\Qt\2009.05\bin;C:\Qt\2009.05\qt\bin 

na twojej ścieżce. Biblioteki w pierwszym folderze (... \ bin) skompilowanym z VS2008 i bibliotekami w drugim (... \ qt \ bin) skompilowanym przy pomocy MinGW. Pozycje w zmiennej ścieżki są wyszukiwane po uruchomieniu aplikacji. Nagle folder z "niewłaściwymi" bibliotekami istnieje przed folderem z właściwym elementem w zmiennej ścieżki. Możesz skopiować QtCore4.dll, QtGui4.dll i inne biblioteki do folderu z plikiem wykonywalnym aplikacji. Mam nadzieję że to pomoże.

Niektóre linki o tym problemie:

+0

Cześć kemiisto, dziękuję za odpowiedź. Uważam, że używam tej samej wersji MinGW. Używam CMake do tworzenia różnych typów plików Makefile. Próbowałem tworzyć pliki Makefile dla MinGW i otrzymywałem błędy, więc umieściłem C: \ Qt \ 2009.05 \ mingw \ bin w mojej ścieżce wiersza polecenia.Po tym CMake był w stanie wygenerować pliki MakeGile MinGW i mogłem użyć mingw32-make do zbudowania biblioteki statycznej. Czy nie byłoby to używanie tej samej wersji? Chyba nie mam innej wersji na moim komputerze. – csmithmaui

+0

@csmithmaui: w takim przypadku mam jeszcze jeden pomysł. Dodałem trochę informacji do mojej wiadomości. – Wildcat

+0

Przeanalizowałem moją ścieżkę i właściwie nie mam ani jednego z tych, które napisałeś powyżej. Po prostu mam C: \ Qt \ 2009.05 \ mingw \ bin. Moja biblioteka statyczna buduje się dobrze w wierszu polecenia po uwzględnieniu ścieżki MinGW, którą właśnie omówiłem. Problem polega na tym, że gdy próbuję połączyć się z moją biblioteką z QtCreator, otrzymuję błędy linkera. Przeczytałem linki, które opublikowałeś, ale nie sądzę, że to mój problem. Ponadto, jeśli usunę wszelkie odwołania do klasy zawartej w danym pliku, wszystko inne łączy się dobrze. Doceniam twoją pomoc. – csmithmaui

2

Tylko w przypadku ktokolwiek inny ma ten problem: mój projekt odbudowy używał .o pliki z poprzedniej kompilacji. Zmieniłem kompilatory pomiędzy.

Okazało się, że gdy przebudowałem ten sam projekt, nowy kompilator nie zbudował nowych plików .o, więc brakowało im niektórych kluczowych informacji. Po usunięciu starych plików i odbudowie błąd został naprawiony.

Zakładam, że przebudowanie od zera, bez usunięcia, będzie działać tak samo.

0

Być może użyłeś gcc zamiast g++. gcc jest kompilatorem C. ale g ++ jest kompilatorem C++.

po prostu upewnij się, że używasz g ++, jeśli masz pliki .cpp.

Powiązane problemy