Linux下同时运行不同版本的qt程序

因项目需要,可能有不同版本的qt程序要运行到同一台机器上,本次实验是qt4.8.5和qt5.3.1开发的程序同时运行在同一台机器上,此机器可以不按照qt的任何版本,当然,两个版本开发的qt与机器的位数必须一样,例如都是32位或者64位。

两个版本的qt的程序我都采用动态编译(静态编译方法请度娘),所以需要把运行程序所需的动态库放到程序可以链接的地方,程序可以链接的动态库路径参见:linux动态库搜索路径。此处直接贴出结论:动态库的搜索路径搜索的先后顺序是:

  1.编译目标代码时指定的动态库搜索路径;

  2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

  3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;

  4.默认的动态库搜索路径/lib;

  5.默认的动态库搜索路径/usr/lib。

考虑到一台机器要运行多个不同版本的qt,而且不能要求机器一定会安装了某个版本的qt,所以不同qt版本的程序所需的动态库最好是放在编译目标代码指定的动态库路径,做到路径独立,因为如果把动态库放在/lib和/usr/lib的话,那么其他版本的qt程序也会到这个地方搜索动态库,可能出现冲突。故此,我这里qt4.8.5和qt5.3.1的程序都在编译时指定动态库路径为工程所在目录下面的lib。

一、对于qt4.8.5具体操作如下:

1)修改工程文件(.pro文件),加上一行LIBS += -L./lib,注意,-L后面不能有空格,要紧跟你指定的动态库路径(可以自由指定),然后保存文件。

2)在终端去到你工程所在目录,执行命令qmake xxx.pro,其中xxx.pro是你的工程文件,命令执行完毕后生成Makefile,用vi或者其他工具打开Makefile,然后搜索LIBS,可以看到,我们这里的LIBS已经加上了你刚才在.pro文件里面配置的./lib,具体如图(图中的-L./lib)所示:

3)执行make得到可执行文件xxx。

测试方法:通过ldd命令查看xxx依赖的动态库指向哪里,命令如下:

ldd untitled | grep -i qt, #这里的untitled为刚才make出来的可执行文件

命令执行结果为:

libQtGui.so.4 => /usr/local/Trolltech/Qt-4.8.5/lib/libQtGui.so.4 (0x00007f289a88e000)
libQtCore.so.4 => /usr/local/Trolltech/Qt-4.8.5/lib/libQtCore.so.4 (0x00007f289a3a0000),

可见此时编译出来的可执行文件的动态库是指向/usr/local/Trolltech/Qt-4.8.5/lib/,这个路径为qt的安装路径,个人猜测是你用qtCreator编写qt程序时就已经默认加上这个动态库搜索路径的,这是qtCreator已经配置了这个路径,具体见qtCreator的Tools-->Options-->Build & Run-->Kits-->Qt Version.

首先我们把这些依赖的库拷贝到我们的可执行文件的同级目录的lib下,首先用终端去到我们的qt工程所在目录,执行命令如下:

mkdir lib    #创建lib目录,目录名必须要与我们在pro文件新增的LIBS += -L后面指定的目录名称一致

cp /usr/local/Trolltech/Qt-4.8.5/lib/libQtGui.so.4 ./lib  #把依赖的库拷贝到lib里面

cp /usr/local/Trolltech/Qt-4.8.5/lib/libQtCore.so.4 ./lib

我们通过屏蔽当前可执行文件指向的动态库路径模拟一个没有安装qt的机器,执行命令如下:

cd /usr/local/Trolltech/Qt-4.8.5;mv lib lib-bak,

这样把lib改名后,我们重新执行了ldd untitled | grep -i qt,命令的结果如下:

libQtGui.so.4 => ./lib/libQtGui.so.4 (0x00007f89a6631000)
libQtCore.so.4 => ./lib/libQtCore.so.4 (0x00007f89a6142000),

可见此时的可执行文件可以自动把动态库路径指向我们编译时执行的./lib,运行可执行文件正常。

最终,我们发布文件时,要把lib拷贝到可执行文件的当前目录,同时把所需的库拷贝到lib里面,把可执行文件和lib一起发布即可。

二、对于qt5.3.1:

这里我采用与qt4.8.5一样的方法,在工程文件所在目录创建lib目录,然后在.pro文件加上LIBS += ./lib,然后重新qmake xxx.pro,然后make,然后ldd xxx | grep -i qt,然后,命令执行结果的所有so文件拷贝到工程文件所在目录的lib里面,然后屏蔽掉ldd xxx | grep -i qt命令执行结果的qt安装路径里面对应的lib,即把这个对应的lib改个名字,然后运行我们的make出来的可执行程序,然后提示错误,error while loading shared libraries: libQt5Widgets.so.5: cannot open shared object file: No such file or directory,然后我用ldd查看动态库链接情况,ldd version531 | grep -i qt,(version531为make出来的可执行程序),结果如下:

libQt5Widgets.so.5 => not found
    libQt5Gui.so.5 => not found
    libQt5Core.so.5 => not found
但是我查看工程目录所在目录的lib,里面是有这几个文件的,不过是一个软连接,但是这个软连接所链接的文件我也已经拷贝在lib里面的,不知道为什么还是提示找不到,没办法,我只有通过环境变量LD_LIBRARY_PATH指定动态库搜索路径到lib了,执行如下命令:

export LD_LIBRARY_PATH=./lib

此时,再次运行可执行文件,然后又出错,提示如下:
    This application failed to start because it could not find or load the Qt platform plugin "xcb".
Reinstalling the application may fix this problem.
Aborted

这个错误,我在网上搜索了下,这个错误的原因是qt5的新特性导致的,最终的解决办法在工程目录创建platforms目录,然后把安装qt5的目录的lib所在目录的同一级目录的plugins/platforms里面的libqxcb.so拷贝到刚才新建的platforms目录,重新运行可执行文件,可以正常运行,此时我把LD_LIBRARY_PATH环境变量置为空也正常了。

http://blog.csdn.net/u013281495/article/details/50540798

时间: 2024-10-10 09:28:58

Linux下同时运行不同版本的qt程序的相关文章

linux下编译运行TIGL Viewer步骤

linux下编译运行TIGL Viewer步骤(仅为了正确编译安装的话直接跳到步骤3) 1. linux发行版选择:由于linux发行版众多,不同版本包含的库版本可能存在差别,因此需要选择正确的版本.由于在openCascade推荐使用的发行版列表中,对Ubuntu比较熟悉,所以选用ubuntu.(其他发行版的包安装方式与ubuntu有较大差别,不熟悉的话会比较麻烦) 2. ubuntu版本选择:虽然openCascade推荐使用ubuntu13.04版本,但因为13.04非长期支持版,所以使用

Linux下后台运行任务

http://www.cnblogs.com/xianghang123/archive/2011/08/02/2125511.html http://blog.csdn.net/u012700515/article/details/27113313 http://www.ibm.com/developerworks/cn/linux/l-cn-nohup/ 将一个正在运行的任务放到后台,并且关机后任能运行 ctrl+z jobs #查找jobs的id disown -h %num #num为jo

jconsole、jvisualvm监控远程linux下tomcat运行情况的配置

1.编辑tomcat/bin/catalina.sh 找到Execute The Requested Command,把以下代码加入到这段注释上面(中间无换行): CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname=10.12.116.135 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8088 -Dcom.sun.management.jmxr

linux下opengl的安装(with qt)

sudo apt-get install build-essential sudo apt-get install libgl1-mesa-dev sudo apt-get install libglu1-mesa-dev sudo apt-get install freeglut3-dev qt的.pro文件添加: LIBS += -lglut  \ -lGL linux下opengl的安装(with qt)

TeamViewer 9发布-在Linux下安装运行

这篇指南介绍了怎么样在 RedHat. CentOS. Fedora 和 Debian. Ubuntu. Linux Mint. Xubuntu 等这些系统中安装 Teamviewer 9.Teamviewer 是一款流行的应用软件,用于远程辅助.桌面共享.计算机之间互传文件.网络会议及在线会议等方面,并且它是一款专业应用程序.而且,个人用户可以免费使用.Teamviewer可以运行在 Windows.Linux.Mac OS.Android 系统以及 iPhone 设备上,它使用它自己集成的

【转】Linux下nohup命令实现退出终端后程序继续后台运行

Unix/Linux下一般想让某个程序在后台运行,很多都是使用&在程序结尾来让程序自动运行:但如果要想在退出终端后,程序依然还在后台运行,则要用nohup与&组合来实现. nohup 命令 用途:不挂断地运行命令 语法:nohup Command [ Arg ... ] [& ] 描述:nohup 命令运行由 Command参数和任何相关的Arg参数指定的命令,忽略所有挂断(SIGHUP)信号.在注销后使用 nohup 命令运行后台中的程序:要运行后台中的 nohup 命令,需要添

linux 下 tomcat 运行报错 Broken pipe

感谢:http://hi.baidu.com/liupenglover/blog/item/4048c23ff19f1cd67d1e7184.html 有可能是linux的线程机制会产生JVM出错的问题,特别是在连接高峰期间经常出现这样的问题,tomcat在linux下也出现类似情况. 解决办法是在环境变量中设置: _JAVA_SR_SIGNUM = 12 基本就可以解决. 在WIN环境变量中设置: _JAVA_SR_SIGNUM=12, 若Linux下用 export _JAVA_SR_SIG

Linux下tomcat运行命令

tomcat启动 [[email protected] webapps]# /usr/local/tomcat7.0/bin/catalina.sh start startup.sh的源代码,其实就是执行   catalina.sh start  这个命令,效果是一样的,根本不是什么调试模式,调试模式的命令是  catalina.sh debug 查看报错日志 cat /usr/local/tomcat7.0/logs/catalina.out linux下实时查看tomcat运行日志 1.先切

分析linux下如何运行一个执行文件

本文只为整理思路,供自己日后参考.现在就从从一个执行文件a.out的运行开始,自上而下地分析linux是如何运行一个执行文件的. 1.首先,需要了解一下a.out这个目标文件.a.out在linux下是ELF(Executable Linkable Format)文件格式,该目标文件由一个文件头.代码段.数据段(已初始化).从定位信息区.符号表及符号名字字符串构成,如下左图所示,经过链接后生成执行文件如下右图所示,需要说明的是1).bss段在目标文件和执行文件中并不占用文件的空间,但是它在加载时