Неопределенные ссылки при попытке связать приложение Qt с моей статической библиотекой - PullRequest
6 голосов
/ 03 февраля 2010

У меня есть статическая библиотека, которую я создал с помощью MinGW, я пытаюсь связать эту библиотеку из приложения Qt. Я продолжаю получать ошибки компоновщика, вызванные одним из объектных файлов в библиотеке. Этот файл фактически объявляет пару заголовков Boost, один для использования shared_ptr, а другой, чтобы я мог сделать класс не копируемым. Я полагаю, что использование этой функциональности повышения является причиной проблемы, но я понятия не имею, почему. Если я закомментирую классы в приложении 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: \ л \ построить \ Windows \ MinGW \ libfoo.a (foo_ctis.cpp.obj): foo_ctis.cpp :( текст + 0x24b).: неопределенная ссылка на `_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 :( текст $ _ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_ [подталкивание :: подробно :: shared_count :: shared_count (Foo :: foo_SomeClassImpl. *)] + 0xc): неопределенная ссылка на `__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.cpp :( текст $ _ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_ [подталкивание :: подробно :: shared_count :: shared_count (Foo :: foo_SomeClassImpl. *)] + 0xfb): неопределенная ссылка на `_Unwind_SjLj_Resume '

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

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

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

Ответы [ 3 ]

3 голосов
/ 03 февраля 2010

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

Обновление

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

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

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

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

2 голосов
/ 08 ноября 2012

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

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

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

0 голосов
/ 10 августа 2014

вы могли использовать gcc вместо g++.gcc - это компилятор Cно g ++ - это компилятор c ++.

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

...