Linux上发布因QT版本差造成运行错误

720 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、前言

目前很多Linux发行版都会自带QT运行库,但是版本参差不齐,而使用QT高版本独有函数的程序在低版本系统上便会遇到运行问题,这时候如果不能携带高版本运行库的情况下,唯一的解决办法就是找到版本差异的独有函数,用低版本的函数或通用的函数来替代

二、问题现象与解决办法

2.1 问题

运行程序报以下错误

./MyApp: relocation error: ./MyApp: symbol _ZNK10QJsonValue8toStringEv, version Qt_5 not defined in file libQt5Core.so.5 with link time reference 重定位错误:在Qt5Core的so文件里没有找到_ZNK10QJsonValue8toStringEv这个符号,因为我们在编译的时候,高版本里是包含了这个函数的,所以在编译时就链接了,但是在低版本运行环境里没有找到这个符号,出现链接错误

2.2 问题分析

由错误所知是由于定位不到_ZNK10QJsonValue8toStringEv这个函数导致,这时我们先用c++filt将符号还原

yuan@yuan:~$ c++filt _ZNK10QJsonValue8toStringEv
QJsonValue::toString() const 由此分析到是由于QJsonValue::toString() const这个函数有问题,这个时候就可以去查看源码

ipmsgclip_s_1651908740.png

可以看到确实5.9有这个函数,但是5.6是没有的

2.3 解决问题

解决办法有两个

  1. 是用低版本的函数替代
  2. 是用通用的函数重新实现 一般来说QT迭代版本的时候更新API都是对低版本API进行优化,所以一般都能找到低版本替代函数
    这里就看到5.6版本和5.9都有QJsonValue::toString(const QString&) const函数,那我们将代码从 QJsonValue::toString() const改成QJsonValue::toString(const QString&) const就能达到目的了,即使有些找不到低版本替代,为了跨版本,就只能想办法重新实现了,很显然这里是没有办法重实现的,好在也还有jsoncpp这种第三方库也很方便,但不到万不得已,尽量使用第一个解决办法
2.4 例子

原代码:

QString data = value.toString(); 修改后: QString data = value.toString(QString());

完美解决!!!