Qt静态编译 -- 动态链接库搜索路径

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35865125/article/details/87909344

                                                                       陌 上 花 开


由一个问题引出静态编译Qt的必要: 如何在一个系统中编译得到一个qt可执行程序,然后,可以拿到另一个没有安装qt的系统(同型号)中可以直接运行?

一般情况下,我们用Qt编译出来的程序是要依赖于系统Qt库的,也就是这个程序移到别的没有安装Qt库的系统上是不能使用的。会提示缺少xx库文件之类的错误, 这是动态编译的结果, 即在编译你的qt代码时使用的是动态编译方式。   若要想静态编译,则需要安装静态编译的qt,可以参考:

https://www.cnblogs.com/lvdongjie/p/7248198.html?utm_source=itdadao&utm_medium=referral

https://blog.csdn.net/qq_37468954/article/details/76537829  

 


实例:探索qt程序运行时,动态链接库的搜索路径:

将qt11安装在目录/opt/Qt5.11.1/, 自己在qt creator下编译的程序可以正常执行。然后,手动改安装目录的名字,将Qt5.11.1文件夹名字改为Qt5.11.1C,然后,之前可以执行的qt程序不能执行了,报错:

原因分析:

编译程序时,采用的动态编译,而且,qmake生成的makefile文件中使用了g++ rpath选项来指定运行时的搜索路径为/opt/Qt5.11.1/5.11.1/gcc_64/lib,程序执行时需要加载动态链接库,会首先从g++ rpath指定的这个路径去搜索,但是该了名字之后该路径不存在了,于是从系统默认的动态链接库目录(例如/usr/lib)中去搜索,结果从/usr/lib/x86_64-linux-gnu/目录中搜索到了,例如libQt5Widgets.so.5,但是这个链接库对应的是低版本的qt库(可能系统自带的或以前在系统中安装过)(参考本文后半ldd部分),于是提示了上述的错误!

关于linux搜索动态链接库的方法,可以参考我的:https://blog.csdn.net/qq_35865125/article/details/87868653

####################

使用ldd命令可以查看可执行文件依赖那些动态连接库:

更改了安装目录名字之后,执行ldd 文件名,会报错,找不到qt相关的库:

正常时会显示:

在 ldd 命令打印的结果中,“=>”左边的表示该程序需要连接的动态连接库的名称(这些库的名字信息应该是编译程序的时候保存到可执行文件里面的),右边表示由 Linux 找到的对应的库文件在文件系统中的具体位置。

ld-linux.so是专门负责寻找库文件的库。以cat为例,cat首先告诉ld-linux.so它需要libc.so.6这个库文件,ld-linux.so将按一定顺序找到libc.so.6库再给cat调用。那ld-linux.so又是怎么找到的呢?其实不用找,ld-linux.so的位置是写死在程序中的,gcc在编译程序时就写死在里面了。Gcc写到程序中ld-linux.so的位置是可以改变的,通过修改gccspec文件。

上面出错的信息是为什么?经查看,在系统的usr/lib/x86_64-linux-gnu/目录下存在对应的qt的动态链接库文件(可能系统自带的或以前在系统中安装过),这个目录下的动态链接库文件与qt安装目录下的动态链接库文件有什么区别?:

以libQt5Core.so.5文件为例子,在Qt的安装目录下/opt/Qt5.11.1/5.11.1/gcc_64/lib中:

可知,其为一个链接文件。

在usr/lib/x86_64-linux-gnu/目录下:

可知,在两个目录下libQt5Core.so.5都是一个链接,只是指向的文件不同,  usr/lib/x86_64-linux-gnu/中的链接指向了qt5.2版本,可能之前安装过qt5.2,或者系统自带,所以出错。

 

另外,更改了qt的安装目录文件名后,更新/etc/ld.so.conf.d/,在这个目录下增加一个conf文件,包含新的路径就可以找到qt的库了,即告诉系统一个新的动态链接库搜索路径。

 


动态链接库介绍:

https://www.cnblogs.com/Anker/p/3527677.html

https://blog.csdn.net/qq_35865125/article/details/80668506

https://cloud.tencent.com/developer/article/1166353

猜你喜欢

转载自blog.csdn.net/qq_35865125/article/details/87909344