Вопрос по undefined-reference, cmake, mingw, boost, qt – Неопределенные ссылки при попытке связать приложение Qt с моей статической библиотекой

6

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

C: \ blah \ build \ windows \ mingw \ libfoo.a (foo_ctis.cpp.obj): foo_ctis.cpp :(. Text + 0x10a): неопределенная ссылка на `__gxx_personality_sj0 '

C: \ blah \ build \ windows \ mingw \ libfoo.a (foo_ctis.cpp.obj): foo_ctis.cpp :(. Text + 0x12f): неопределенная ссылка на `_Unwind_SjLj_Register '

C: \ blah \ build \ windows \ mingw \ libfoo.a (foo_ctis.cpp.obj): foo_ctis.cpp :(. Text + 0x203): неопределенная ссылка на `_Unwind_SjLj_Resume '

C: \ blah \ build \ windows \ mingw \ libfoo.a (foo_ctis.cpp.obj): foo_ctis.cpp :(. Text + 0x20e): неопределенная ссылка на `_Unwind_SjLj_Unregister '

C: \ blah \ build \ windows \ mingw \ libfoo.a (foo_ctis.cpp.obj): foo_ctis.cpp :(. Text + 0x226): неопределенная ссылка на `__gxx_personality_sj0 '

C: \ blah \ build \ windows \ mingw \ libfoo.a (foo_ctis.cpp.obj): foo_ctis.cpp :(. Text + 0x24b): неопределенная ссылка на `_Unwind_SjLj_Register '

C: \ blah \ build \ windows \ mingw \ libfoo.a (foo_ctis.cpp.obj): foo_ctis.cpp :(. Text + 0x31f): неопределенная ссылка на `_Unwind_SjLj_Resume '

C: \ blah \ build \ windows \ mingw \ libfoo.a (foo_ctis.cpp.obj): foo_ctis.cpp :(. Text + 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   ответа
2

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

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

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

0

gcc вместоg++, gcc - это компилятор C но g ++ - это компилятор c ++.

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

3

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

Обновить

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

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

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

Некоторые ссылки на эту проблему:

@ qtforum.org@ кое-что в блоге (на русском =)
Хотел сообщить, что вы на правильном пути в решении проблем, с которыми я столкнулся на прошлой неделе. Оказалось, что GNUStep был включен в мой путь, и GCC, включенный в него, использовался для создания моей библиотеки, что, в свою очередь, было несовместимо с приложением Qt, которое использовало MinGW GCC. Благодарю. clintsmith
Привет, Кемиисто, спасибо за ваш ответ. Я считаю, что я использую ту же версию MinGW. Я использую CMake для создания различных типов make-файлов. Я пытался создать make-файлы для MinGW, и я получал ошибки, поэтому я включил C: \ Qt \ 2009.05 \ mingw \ bin в путь к командной строке. После этого CMake смог сгенерировать make-файлы MinGW, и я смог использовать mingw32-make для создания статической библиотеки. Разве это не будет использовать ту же версию? Я не думаю, что у меня есть другая версия на моем компьютере. clintsmith
Я проанализировал свой путь, и у меня на самом деле нет ни одного из тех, что вы опубликовали выше в нем. У меня просто есть C: \ Qt \ 2009.05 \ mingw \ bin. Моя статическая библиотека прекрасно работает в командной строке после включения пути MinGW, который я только что упомянул. Проблема в том, что когда я пытаюсь связать свою библиотеку с QtCreator, я получаю ошибки компоновщика. Я прочитал ссылки, которые вы разместили, но я не думаю, что это моя проблема. Кроме того, если я уберу любые ссылки на класс, содержащийся в рассматриваемом файле, все остальное ссылки в порядке. Я действительно ценю твою помощь. clintsmith
@csmithmaui: в этом случае у меня есть еще одна идея. Я добавил информацию в свое сообщение. Wildcat

Похожие вопросы