Приложение вылетает с "символом _ZdlPvm, версия Qt_5 не определена в файле libQt5Core.so.5 со ссылкой на время ссылки"

У меня следующая ситуация: мне нужно, чтобы программа работала на сервере AWS EC2.

Программа сделана с использованием Qt. Недавно я обновил программу И версию Qt, предоставленную Amazon, до 5.9.2.

Я разрабатываю программу на одном из своих компьютеров и, когда она готовится, копирую ее на сервер.

Я использую второй компьютер для подключения к серверам (я могу переключаться между подключенным к компьютеру рядом со мной или сервером AWS).

Теперь проблема в том, что когда я выполняю одну из транзакций, программа на сервере AWS вылетает с такой ошибкой:

symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference

Если я сделаю ту же транзакцию с программой на моем собственном локальном компьютере, она будет работать нормально.

Мне это не кажется ошибкой, вызванной моим кодом, а скорее связью и / или процессом компиляции.

Может ли кто-нибудь сказать мне, что это означает, как я могу диагностировать проблему?

Это означает, что ваш компьютер и ваш веб-сервер, размещенный на Amazon, имеют разные версии инфраструктуры QT. Когда вы компилируете и связываете код с вашей библиотекой C++, полученный двоичный файл может использовать только ту же (или совместимую) версию библиотеки во время выполнения. Копирование этого приложения на ваш сервер и его запуск приведет к такого рода сбоям загрузки, если библиотеки времени выполнения на вашем сервере не совместимы с ABI с версией библиотеки, которую вы скомпилировали и с которой связали.

Sam Varshavchik 27.10.2018 16:08

Но это странно. Но мой компьютер и сервер используют 5.9.2 64 бита. И это не было проблемой, когда я использовал предыдущую версию (5.6). На всякий случай, какие шаги я должен сделать, чтобы убедиться, что версии Qt Framework совпадают?

aarelovich 27.10.2018 16:21

В случае, если это кому-то поможет, я решил проблему, скомпилировав программу на самом сервере Amazon. Это подтверждает идею о том, что в Qt Framework была разница, но я буду проклят, если узнаю, что это значит.

aarelovich 28.10.2018 11:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
13
3
9 729
1

Ответы 1

У меня была такая же проблема с Qt 5.11.2 от KDE Neon. Но никаких проблем с официальным Qt 5.11.2 SDK.

Если я добавлю в проект этот флаг: QMAKE_CXXFLAGS += "-fno-sized-deallocation", все снова заработает.

Я считаю, что если вы скомпилируете свою программу как C++ 14 или выше, код попытается освободить размер. Потому что компиляция с -std=c++11 не вызывает этой проблемы.

Вероятно, Qt из KDE Neon был скомпилирован как C++ 11.

Спасибо за ответ!! Я решил проблему, но буду помнить об этом в будущем

aarelovich 11.11.2018 10:32

В общем, может случиться так, что вызывающая программа и библиотеки Qt были скомпилированы по-разному, и возникает исключение совместимости. В моем случае использовались две версии компилятора. Перекомпиляция отставшего элемента решила проблему.

XavierStuvw 11.02.2020 13:23

У меня аналогичная проблема, но двоичный файл в каталоге сборки работает, а установленный системой двоичный файл не работает после того, как я sudo make install. Могут ли зависимости изменяться в зависимости от того, какой двоичный файл находится в моей папке сборки или в моем /usr/local/bin?

Gauthier 16.09.2020 14:33

Да, поскольку в Linux есть механизм RPATH, вы можете сделать зависимости относительными к двоичному пути. Также бывает, что если вы работаете из QtCreator, по умолчанию Qt lib будет загружаться из того, что было указано в проекте, а не из системных библиотек. В этом случае ищите LD_LIBRARY_PATH.

Marcos Zolnowski 17.09.2020 19:40

Другие вопросы по теме