У меня следующая ситуация: мне нужно, чтобы программа работала на сервере 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
Если я сделаю ту же транзакцию с программой на моем собственном локальном компьютере, она будет работать нормально.
Мне это не кажется ошибкой, вызванной моим кодом, а скорее связью и / или процессом компиляции.
Может ли кто-нибудь сказать мне, что это означает, как я могу диагностировать проблему?
Но это странно. Но мой компьютер и сервер используют 5.9.2 64 бита. И это не было проблемой, когда я использовал предыдущую версию (5.6). На всякий случай, какие шаги я должен сделать, чтобы убедиться, что версии Qt Framework совпадают?
В случае, если это кому-то поможет, я решил проблему, скомпилировав программу на самом сервере Amazon. Это подтверждает идею о том, что в Qt Framework была разница, но я буду проклят, если узнаю, что это значит.
У меня была такая же проблема с 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.
Спасибо за ответ!! Я решил проблему, но буду помнить об этом в будущем
В общем, может случиться так, что вызывающая программа и библиотеки Qt были скомпилированы по-разному, и возникает исключение совместимости. В моем случае использовались две версии компилятора. Перекомпиляция отставшего элемента решила проблему.
У меня аналогичная проблема, но двоичный файл в каталоге сборки работает, а установленный системой двоичный файл не работает после того, как я sudo make install
. Могут ли зависимости изменяться в зависимости от того, какой двоичный файл находится в моей папке сборки или в моем /usr/local/bin
?
Да, поскольку в Linux есть механизм RPATH, вы можете сделать зависимости относительными к двоичному пути. Также бывает, что если вы работаете из QtCreator, по умолчанию Qt lib будет загружаться из того, что было указано в проекте, а не из системных библиотек. В этом случае ищите LD_LIBRARY_PATH.
Это означает, что ваш компьютер и ваш веб-сервер, размещенный на Amazon, имеют разные версии инфраструктуры QT. Когда вы компилируете и связываете код с вашей библиотекой C++, полученный двоичный файл может использовать только ту же (или совместимую) версию библиотеки во время выполнения. Копирование этого приложения на ваш сервер и его запуск приведет к такого рода сбоям загрузки, если библиотеки времени выполнения на вашем сервере не совместимы с ABI с версией библиотеки, которую вы скомпилировали и с которой связали.