我有一个在QT5.9环境下构建的程序。当我将程序复制到安装在QT5.6中的服务器时,程序无法启动,出现以下错误:
./myapp: /usr/lib64/libQt5Core.so.5: version `Qt_5.9' not found (required by ./myapp)但是,确实存在/usr/lib64 64/libQt5Core.so.5,它是指向libQt5Core.so.5.6.1的链接。
我认为.so文件的次要版本不会破坏兼容性。字符串`Qt_5.9‘如何进入myapp,以及它如何影响程序的加载?
发布于 2021-01-29 10:45:59
Qt库的次要版本只维护向后二进制和源代码兼容性,这意味着旧的可执行文件将与较新的库一样工作(参见详细信息这里)。
因此,如果您打算使用Qt5.6在服务器上部署您的程序,那么应该使用QT5.6或更高版本进行编译,而且只要您不使用最近的次要版本中引入的特性,就应该能够使用旧版本重新编译,而无需更改任何内容。
版本符号"Qt_5.9“或"Qt_5.6”存储在可执行文件和库中。您可以使用objdump -p /usr/lib64/libQt5Core.so.5或objdump -p ./myapp获取库与之兼容的版本列表(列出每个次要版本),在“版本定义”一节中:
$ objdump -p /usr/lib64/libQt5Core.so.5
/usr/lib64/libQt5Core.so.5: file format elf64-x86-64
[...]
Version definitions:
1 0x01 0x00028eb5 libQt5Core.so.5
2 0x00 0x0dcbd2c9 Qt_5_PRIVATE_API
3 0x00 0x00058a25 Qt_5
4 0x00 0x058a2810 Qt_5.0
Qt_5
5 0x00 0x058a2811 Qt_5.1
Qt_5.0
[...]
19 0x00 0x08a28115 Qt_5.15
Qt_5.14或者在“版本引用”部分下编译可执行文件的库的版本:
$ objdump -p /bin/qtcreator
/bin/qtcreator: file format elf64-x86-64
[...]
Version References:
required from libQt5Gui.so.5:
0x00058a25 0x00 12 Qt_5
[...]
required from libQt5Core.so.5:
0x08a28115 0x00 06 Qt_5.15
0x00058a25 0x00 02 Qt_5ELF二进制文件中的符号可能是版本化的,这意味着版本标记可能会添加到每个符号中,链接器可能希望导入带有特定版本标记的符号。objdump输出中的“版本”部分似乎直接来自二进制文件中的结构(这些结构被描述为这里)。
对于上面的示例,be创建者二进制代码使用Qt_5和Qt_5.15版本标记从libQt5Core.so.5导入符号,因此二进制依赖于定义这两者的库,这应该是任何版本为5.15和更高版本的库的情况。
发布于 2021-02-01 17:17:46
Qt在Qt发行版中使用major.minor.patch编号方案。例如,QT5.0.1代表了QT5.0的第一个补丁版本。为了提供一个可预测和稳定的API,每个版本都限制了哪些更改是可以接受的。这使得那些只对某些类型的改进感兴趣的用户能够确保他们不会因为升级到更新版本而受到不利的影响。
主要的版本可能会破坏向后二进制和源代码兼容性,尽管可以保持源代码兼容性。
次要的版本是向后二进制和源代码兼容的。
修补程序版本前后都是二进制和源代码兼容的。
因此,您不能在qt 5.9下运行qt 5.6!
https://stackoverflow.com/questions/65900281
复制相似问题