zoukankan      html  css  js  c++  java
  • 移植32位QT程序到ubuntu18.04

    1,操作系统变更

    某个程序A,是在ubuntu12.04的虚拟机上编译QT4.8的源代码,并将最终的执行程序运行在ubuntu12.04系统上。

    由于出货要更换主板,供应商提供的ubuntu操作系统版本确定为18.04。

    测试结果表明,原ubuntu12.04的虚拟机上编译的执行程序无法直接运行在ubuntu18.04系统上。

    2,无法直接运行的原因

    ubuntu18.04为64位操作系统,默认采用64位代码库,而ubuntu12.04的虚拟机为32位系统,虚拟机上编译的执行程序为32位,执行程序启动后需要调用的依赖库均为32位文件,这些条件在ubuntu18.04上默认均不提供,因此无法直接运行在新的操作系统上。

    3,解决思路

    第一种思路是,将A程序源代码在ubuntu18.04机器上重新编译一遍,如此产生的执行文件即可在ubuntu18.04系统下执行。其优势在于,一次性彻底解决问题;其劣势在于,需要熟悉QT编译环境配置,特别是QT4的环境较为古老,各种依赖库在ubuntu18.04下不一定完全支持,代码功能也不一定能与32位保持一致,编译也不一定能成功。

    第二种思路是,在ubuntu18.04机器上配置32位程序的运行环境。其优势在于,当前代码无需重新编译为64位程序,程序行为与以前会大概率保持一致;其劣势在于,需摸索搭建32位运行环境,需深度测试,需重新编写安装手册。

    目前实现的方案采用的是第二种。

    4,部署条件

    本部署条件针对的是方案二,即要在ubuntu18.04机器上运行32位的A软件。以下条件供采购或者系统安装时参考:

     1)      ubuntu18.04必须是中文系统

    2)      ubuntu18.04必须是同时支持64位和32位程序运行的系统。具体判断如下:

    a)      在终端输入 dpkg --print-architecture,返回amd64
    
    b)      在终端输入 dpkg --print-foreign-architectures,返回i386

    5,系统配置步骤

    5.1,操作系统安装32位运行库

    apt update
    apt install libc6:i386 libstdc++6:i386
    apt install lib32ncurses5 lib32z1

    5.2,配置LD_LIBRARY_PATH

    在当前用户的主文件夹中,先打开“显示隐藏文件”选项,然后点击右键,用文本编辑器打开 .bashrc文件。

    在.bashrc文件中最后添加一行,

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/f/mypro/lib

     注意:冒号后面的路径为 查询机程序下的lib子目录路径,此处仅为示例,应根据实际路径进行替换。

    5.3,添加32位依赖库

    本步骤最为关键,也最为繁琐。需要将A程序运行时依赖的32位库文件全部从原操作系统中找出来,然后复制到上述LD_LIBRARY_PATH包含的路径中。

    比如,在没有复制依赖库之前,运行程序后会显示找不到“×.so.×”之类的文件。

    f@f-To-be-filled-by-O-E-M:~/mypro$ ./mypro
    ./mypro: error while loading shared libraries: libQtWebKit.so.4: cannot open shared object file: No such file or directory

    此时,要到原系统中,采用locate或whereis命令,找到该so文件,复制到ubuntu18.04系统下的LD_LIBRARY_PATH包含的路径中。

    该过程相当费时费力,因为每次运行程序只会提示一个错误就停下来。

    因此建议使用 ldd 命令一次性将程序运行的依赖库文件一次性显示出来。注意下图中,凡右侧为空的,就是缺少的库文件。

    5.4,配置QT运行环境

    32位的QT程序如果使用了数据库,无论是mysql还是sqlite3,均需要32位的驱动。因此要在运行程序目录中添加一个qt.conf文件,指定程序要找驱动的位置。

    [Paths]
    Plugins = ./plugins

    然后将原系统中的驱动程序拷贝到运行文件目录下的plugins子目录下,如:

    cp -R /usr/lib/i386-linux-gnu/qt4/plugins/ plugins

    plugins子目录下的文件究竟需要哪些,可根据实际需求而定。笔者就是只保留了imageformats和sqldrivers两个目录。

    6,总结

    经过以上工作,原来的32位QT程序顺利地运行在ubuntu18.04系统下了。

    一路安装摸索花了不少时间,但是只要善于运用网络搜索,解决起来并不复杂。在此一并感谢所有相关作者。

    另外,方案一也是值得考虑的,当然这就是后话了。

  • 相关阅读:
    记录
    Remote System Upgrade With Cyclone III Devices
    【Diary】Noip2020 游记
    【Diary】CSP-S 2020 游记
    【Diary】JZSC 2020 旅 游 记(迫真
    【题解】Luogu P2671 【求和】
    51nod 1153 选择子序列
    Luogu P4116 Qtree3
    Luogu P4114 Qtree1
    【Contest】Nowcoder 假日团队赛1 题解+赛后总结
  • 原文地址:https://www.cnblogs.com/jackkwok/p/14890062.html
Copyright © 2011-2022 走看看