2013-02-15 4 views
17

Мне удалось (каким-то образом) скомпилировать Qt5 с компилятором Mingw-w64 Project для 32-разрядной Windows. Все библиотеки установлены на ~/i686-w64-mingw32.Точка входа в процедуру __gxx_personality_sj0 не может быть расположена в ...

У меня есть проект Qt на основе CMake, который я пытаюсь перекрестно скомпилировать. Следуя these instructions, я смог получить проект для компиляции. Все идет нормально.

К сожалению, при выполнении полученного двоичного файла на Windows, я в конечном итоге получаю сообщение об ошибке:

"The procedure entry point __gxx_personality_sj0 could not be located in the dynamic link library [application_name].exe"

* [application_name] является полным путь к основному исполняемому файлу

Я слышал что этот тип проблемы иногда может быть вызван смешиванием библиотек, скомпилированных с различными версиями MinGW. Но все на этой машине (все библиотеки и исполняемый файл) были скомпилированы одним и тем же компилятором (toolchain i686-w64-mingw32).

Кроме того, мне кажется странным, что ошибка жалуется на отсутствие точки входа из исполняемого файла приложения вместо одного из файлов .dll.

Что может вызвать эту ошибку и что можно сделать для ее устранения?

+0

Возможно, вы используете программное обеспечение, скомпилированное с другой версией. – didierc

+0

@didierc: У меня установлена ​​только одна версия Mingw-w64. –

+0

Мне было интересно, если у вас есть программное обеспечение, скомпилированное с другой версией mingw, а не если вы использовали другую версию mingw. Ваш ответ отражает точно мое предположение, что где-то другое программное обеспечение использовало lib, выпущенный с другой версией, и что это каким-то образом помешало вашему скомпилированному программному обеспечению. Полагаю, что я недостаточно хорошо разбирался в вещах, но вы поняли это, к счастью! – didierc

ответ

11

В конце концов выяснилось, что проблема была вызвана изменчивым libstdc++-6.dll где-то в $PATH. Убедившись, что копия, созданная Mingw-w64, находится в каталоге приложения, все работает.

+1

Спасибо! У меня была ошибка «Не удалось найти точку входа процедуры __gxx_personality_sj0 в библиотеке динамических ссылок libstdC++ - 6.dll», и было переименовано «c: \ Windows \ SysWOW64 \ libstdC++ - 6.dll»! –

+1

Перед созданием источников удобно запускать 'where libstdC++ - 6.dll'. В моем случае у меня была установка Anaconda в моей переменной PATH до входа в mingw. –

+0

Я удалил dll из каталога Windows, и он сработал. Тем не менее, это, вероятно, не инструкции, которые я хочу дать людям по телефону, чтобы моя программа работала на их компьютере O.o. О, DLL ад ... – Dmitry

15

Поиск местоположения неверном библиотеки:

  • Открыть командную строку.
  • Тип "libstdC++ - 6.dll" и нажмите "Enter"
  • Окно должно появиться сообщение с пути, и сообщение: C:/SomeFolder/someapp /.../ libstdC++ - 6.dllЭтот файл не связан с программой ... и т. Д. Путь - это ответ.
  • Запуск приложения из среды IDE:% PATH% в IDE может быть , отличное от командной строки% PATH% (см. Настройки IDE). В этот случай, поместив «libstdC++ - 6.dll» в пакетный файл и запустив , пакет из среды IDE должен указать, какой конкретный экземпляр библиотеки, которую подбирает ваша программа.

Мое личное решение:

  • Открыть "Свойства системы" -> "Переменные среды" (в Windows 7, в моем случае) и убедитесь, что оба% PATH% переменных (один для вашей учетной записи И переменной всей системы% PATH%) начинаются с c: \ mingw \ bin (или любого другого пути, который у вас есть для библиотеки). Кроме того, вам, возможно, придется перезапустить свою среду IDE, чтобы получить новую PATH.

По моему опыту, способ MS Windows' выбора местоположения в пределах% PATH% может быть очень нестабильным. В прошлый раз я добавил один исходный файл с одной функцией и включил эту функцию в свой код. Программа всегда выбирала неправильный libstdC++ - 6.dll, даже когда я удалил весь код функции и оставил только оператор 'return'. Каждый раз, когда эта функция была закомментирована (исключена), программа будет работать нормально снова. Я подозреваю, что иногда Windows выбирает PATH из «Системные переменные» и по какой-то причине избегает «Пользовательских переменных» PATH (ваш PATH учетной записи Windows).

Смежные вопросы

 Смежные вопросы