当前位置: 技术问答>linux和unix
linux共享库调用求助
来源: 互联网 发布时间:2016-10-09
本文导语: 刚开始linux编程,有个编程过程中遇到的问题希望得到各位的帮助: 在连接程序时,我使用-l参数指定了要连接的共享库库名为QtGui,根据我的理解, 连接时应该去寻找-L参数指定路径下的libQTGui.so这个文件,连接时我将此文...
刚开始linux编程,有个编程过程中遇到的问题希望得到各位的帮助:
在连接程序时,我使用-l参数指定了要连接的共享库库名为QtGui,根据我的理解, 连接时应该去寻找-L参数指定路径下的libQTGui.so这个文件,连接时我将此文件删除,报无法连接,证明我的想法是正确的。
可是在运行程序时(使用LD_LIBRARY_PATH环境变量加载共享库路径),如果仍将上述文件删除,程序依然能正常运行,经过折腾发现,运行时找的时libQTGui.so.4这个文件,不知道为什么。
哪位大侠能帮助解释一下么?谢谢。
在连接程序时,我使用-l参数指定了要连接的共享库库名为QtGui,根据我的理解, 连接时应该去寻找-L参数指定路径下的libQTGui.so这个文件,连接时我将此文件删除,报无法连接,证明我的想法是正确的。
可是在运行程序时(使用LD_LIBRARY_PATH环境变量加载共享库路径),如果仍将上述文件删除,程序依然能正常运行,经过折腾发现,运行时找的时libQTGui.so.4这个文件,不知道为什么。
哪位大侠能帮助解释一下么?谢谢。
|
1. 编译系统是如何转换为搜名的?
编译系统通过linker name找到了共享库,共享库中有一个字段是其soname,这就从linker name转换到了soname
2. 还有,为什么要转换为搜名?
应用程序存放soname而不是realname的目的是为了便于共享库升级,soname只包含了共享库的主版本号,主版本号相同表示两个共享库是兼容的,所以以后你的qt升级了,共享库变成了libqtgui.so.4.8.0了,由于它们的soname相同,你的程序现在使用的库是libqtgui.so.4.8.0,只需要把libqtgui.so.4指向升级后的库就可以了(这是在升级过程中由ldconfig完成的),你的程序直接就使用了升级版的qt,而不用重新编译。如果指定real name,那么升级共享库后你的程序使用的还是老版本的库,没法使用升级后功能增强或者发生了变化的库。
编译系统通过linker name找到了共享库,共享库中有一个字段是其soname,这就从linker name转换到了soname
2. 还有,为什么要转换为搜名?
应用程序存放soname而不是realname的目的是为了便于共享库升级,soname只包含了共享库的主版本号,主版本号相同表示两个共享库是兼容的,所以以后你的qt升级了,共享库变成了libqtgui.so.4.8.0了,由于它们的soname相同,你的程序现在使用的库是libqtgui.so.4.8.0,只需要把libqtgui.so.4指向升级后的库就可以了(这是在升级过程中由ldconfig完成的),你的程序直接就使用了升级版的qt,而不用重新编译。如果指定real name,那么升级共享库后你的程序使用的还是老版本的库,没法使用升级后功能增强或者发生了变化的库。