2010-02-03 4 views
6

У меня есть статическая библиотека, которую я создал с помощью MinGW, я пытаюсь связать эту библиотеку с приложением Qt. Я продолжаю получать ошибки компоновщика, вызванные одним из объектных файлов в библиотеке. Этот файл фактически объявляет пару заголовков Boost, один для использования shared_ptr, а другой, чтобы я мог сделать класс noncopyable. Я считаю, что использование этой функции повышения - вот что вызывает проблему, но я понятия не имею, почему. Если я прокомментирую классы в приложении Qt, которые используют класс, определенный в файле, ссылки приложения Qt отлично. Это часть ошибки выхода:Неопределенные ссылки при попытке связать приложение Qt с моей статической библиотекой

C: \ л \ построить \ Windows \ MinGW \ libfoo.a (foo_ctis.cpp.obj). Foo_ctis.cpp :(текст + 0x10a): не определено ссылка на `__gxx_personality_sj0'

C: \ бла \ построить \ Windows \ MinGW \ libfoo.a (foo_ctis.cpp.obj): foo_ctis.cpp :(текст + 0x12f):. неопределенная ссылка на` _Unwind_SjLj_Register '

C: \ л \ построить \ Windows \ MinGW \ libfoo.a (foo_ctis.cpp.obj):. foo_ctis.cpp :(текст + 0x203): неопределенной ссылка на `_Unwind_SjLj_Resume '

C: \ бла \ построить \ Windows \ MinGW \ libfoo.a (foo_ctis.cpp.obj):. Foo_ctis.cpp :(текст + 0x20e): неопределенная ссылка на` _Unwind_SjLj_Unregister'

C: \ бла \ построить \ Windows \ MinGW \ libfoo.a (foo_ctis.cpp.obj): foo_ctis.cpp :(текст + 0x226):. неопределенная ссылка на ` __gxx_personality_sj0'

C: \ blah \ build \ windows \ mingw \ libfoo.a (foo_ctis.cpp.obj): foo_ctis.cpp :(. text + 0x24b): undefined ссылка на `_Unwind_SjLj_Register '

C: \ бла \ построить \ Windows \ MinGW \ libfoo.a (foo_ctis.cpp.obj). Foo_ctis.cpp :(текст + 0x31f): неопределенная ссылка на ` _Unwind_SjLj_Resume»

C : \ бла \ построить \ Windows \ MinGW \ libfoo.a (foo_ctis.cpp.obj): foo_ctis.cpp :(текст + 0x32a):. неопределенная ссылка на ` _Unwind_SjLj_Unregister»

C: \ бла \ сборки \ windows \ mingw \ libfoo.a (foo_ctis.cpp.obj): foo_ctis.cpp :(. text $ _ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_ [boost :: detail :: shared_count :: shared_count (foo :: foo_SomeClassImpl *)] + 0xc): undefinedСсылка на `__gxx_personality_sj0'

C: \ л \ построить \ Windows \ MinGW \ libfoo.a (foo_ctis.cpp.obj):. foo_ctis.cpp :(текст $ _ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_ [подталкивание :: подробнее :: shared_count: : shared_count (Foo :: foo_SomeClassImpl *)] + 0x31): неопределенная ссылка на ` _Unwind_SjLj_Register»

C: \ бла \ построить \ Windows \ MinGW \ libfoo.a (foo_ctis.cpp.obj): foo_ctis. каст :(текст $ _ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_ [подталкивание :: подробно :: shared_count :: shared_count (Foo :: foo_SomeClassImpl *)] + 0xfb). неопределенная ссылка на ` _Unwind_SjLj_Resume»

C: \ blah \ build \ windows \ mingw \ libfoo.a (foo_ctis.cpp.obj): foo_ctis.cpp :(.текст $ _ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_ [подталкивание :: подробно :: shared_count :: shared_count (Foo :: foo_SomeClassImpl *)] + 0x106): неопределенная ссылка на ` collect2 _Unwind_SjLj_Unregister»: л.д. возвращается 1 состояние выхода

Один другой Дело в том, что я использую указатель на реализацию в этом классе. Любая помощь будет высоко оценена.

Решено: Я выяснил, что у меня была старая версия GCC на моем пути, которая была включена до моей версии GCC, поставляемой в MinGW. Старая версия была включена в пакет GNUStep, который я отчасти возвращался. Я думаю, что конфигурация этих разных версий вызывала проблемы. Благодаря kemiisto, который был на правильном пути в решении проблемы.

ответ

3

Кажется, что ваша статическая библиотека была связана с одним дистрибутивом MinGW (т. Е. С третьей версией), но вы пытаетесь связать свое приложение с этой библиотекой, используя другой дистрибутив MinGW (т. Е. Четвертую версию, которая распространяется с двоичным Qt). Вы должны перестроить свою библиотеку, используя тот же MinGW, который вы используете для разработки вашего приложения.

Update

Может быть, это еще одна проблема хорошо известна. Взгляните на this topic. У вас, вероятно, есть две разные папки с Qt libs

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

на вашем пути тоже. Библиотеки в первой папке (... \ bin), скомпилированные с VS2008 и библиотеки во втором (... \ qt \ bin), скомпилированные с помощью MinGW. Элементы в переменной пути просматриваются при запуске приложения. Внезапно папка с «неправильными» библиотеками существует перед папкой с правильным элементом в переменной пути. Что вы можете сделать, так это скопировать QtCore4.dll, QtGui4.dll и другие библиотеки, которые вам нужно установить в папку с исполняемым приложением. Надеюсь это поможет.

Некоторые ссылки об этой проблеме:

+0

Hi kemiisto, спасибо за ваш ответ. Я считаю, что использую ту же версию MinGW. Я использую CMake для создания различных типов make-файлов. Я пытался создать make-файлы для MinGW, и я получал ошибки, поэтому я включил C: \ Qt \ 2009.05 \ mingw \ bin в свой путь командной строки.После этого CMake смог создать make-файлы MinGW, и я смог использовать mingw32-make для создания статической библиотеки. Разве это не будет использовать ту же версию? Я не думаю, что у меня есть другая версия на моем компьютере. – csmithmaui

+0

@csmithmaui: в этом случае у меня есть еще одна идея. Я добавил некоторую информацию в свое сообщение. – Wildcat

+0

Я проанализировал свой путь, и на самом деле у меня нет ни одного из тех, что вы разместили выше. Я просто C: \ Qt \ 2009.05 \ mingw \ bin. Моя статическая библиотека строит отлично в командной строке после включения пути MinGW, который я только что сделал. Проблема в том, что когда я пытаюсь связать свою библиотеку с QtCreator, я получаю ошибки компоновщика. Я прочитал ссылки, которые вы разместили, но я не думаю, что это моя проблема. Кроме того, если я беру любые ссылки на класс, содержащийся в файле, о котором идет речь, все остальное связывает в порядке. Я действительно ценю твою помощь. – csmithmaui

2

Только в случае, если кто-то имеет эту проблему: мой проект перестраивать использовал .o файлы из предыдущей сборки. Я изменил компиляторы между ними.

Оказывается, что когда я перестроил тот же проект, новый компилятор не создал новые файлы .o, поэтому им не хватало ключевой информации. После удаления старых файлов и восстановления, ошибка была исправлена.

Я предполагаю, что восстановление с нуля, без удаления, будет работать так же.

0

Возможно, вы использовали gcc вместо g++. gcc - компилятор C. но g ++ - компилятор C++.

просто убедитесь, что используете g ++, если у вас есть .cpp-файлы.