标签:format form har 中文 程序启动 drive 搜索 plugins rgb
某个程序A,是在ubuntu12.04的虚拟机上编译QT4.8的源代码,并将最终的执行程序运行在ubuntu12.04系统上。
由于出货要更换主板,供应商提供的ubuntu操作系统版本确定为18.04。
测试结果表明,原ubuntu12.04的虚拟机上编译的执行程序无法直接运行在ubuntu18.04系统上。
ubuntu18.04为64位操作系统,默认采用64位代码库,而ubuntu12.04的虚拟机为32位系统,虚拟机上编译的执行程序为32位,执行程序启动后需要调用的依赖库均为32位文件,这些条件在ubuntu18.04上默认均不提供,因此无法直接运行在新的操作系统上。
第一种思路是,将A程序源代码在ubuntu18.04机器上重新编译一遍,如此产生的执行文件即可在ubuntu18.04系统下执行。其优势在于,一次性彻底解决问题;其劣势在于,需要熟悉QT编译环境配置,特别是QT4的环境较为古老,各种依赖库在ubuntu18.04下不一定完全支持,代码功能也不一定能与32位保持一致,编译也不一定能成功。
第二种思路是,在ubuntu18.04机器上配置32位程序的运行环境。其优势在于,当前代码无需重新编译为64位程序,程序行为与以前会大概率保持一致;其劣势在于,需摸索搭建32位运行环境,需深度测试,需重新编写安装手册。
目前实现的方案采用的是第二种。
本部署条件针对的是方案二,即要在ubuntu18.04机器上运行32位的A软件。以下条件供采购或者系统安装时参考:
1) ubuntu18.04必须是中文系统
2) ubuntu18.04必须是同时支持64位和32位程序运行的系统。具体判断如下:
a) 在终端输入 dpkg --print-architecture,返回amd64
b) 在终端输入 dpkg --print-foreign-architectures,返回i386
apt update
apt install libc6:i386 libstdc++6:i386
apt install lib32ncurses5 lib32z1
在当前用户的主文件夹中,先打开“显示隐藏文件”选项,然后点击右键,用文本编辑器打开 .bashrc文件。
在.bashrc文件中最后添加一行,
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/f/mypro/lib
注意:冒号后面的路径为 查询机程序下的lib子目录路径,此处仅为示例,应根据实际路径进行替换。
本步骤最为关键,也最为繁琐。需要将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 命令一次性将程序运行的依赖库文件一次性显示出来。注意下图中,凡右侧为空的,就是缺少的库文件。
32位的QT程序如果使用了数据库,无论是mysql还是sqlite3,均需要32位的驱动。因此要在运行程序目录中添加一个qt.conf文件,指定程序要找驱动的位置。
[Paths]
Plugins = ./plugins
然后将原系统中的驱动程序拷贝到运行文件目录下的plugins子目录下,如:
cp -R /usr/lib/i386-linux-gnu/qt4/plugins/ plugins
plugins子目录下的文件究竟需要哪些,可根据实际需求而定。笔者就是只保留了imageformats和sqldrivers两个目录。
经过以上工作,原来的32位QT程序顺利地运行在ubuntu18.04系统下了。
一路安装摸索花了不少时间,但是只要善于运用网络搜索,解决起来并不复杂。在此一并感谢所有相关作者。
另外,方案一也是值得考虑的,当然这就是后话了。
标签:format form har 中文 程序启动 drive 搜索 plugins rgb
原文地址:https://www.cnblogs.com/jackkwok/p/14890062.html