linux共享库调用求助

riceconjee_chy 2010-10-21 12:36:22
刚开始linux编程,有个编程过程中遇到的问题希望得到各位的帮助:
在连接程序时,我使用-l参数指定了要连接的共享库库名为QtGui,根据我的理解, 连接时应该去寻找-L参数指定路径下的libQTGui.so这个文件,连接时我将此文件删除,报无法连接,证明我的想法是正确的。
可是在运行程序时(使用LD_LIBRARY_PATH环境变量加载共享库路径),如果仍将上述文件删除,程序依然能正常运行,经过折腾发现,运行时找的时libQTGui.so.4这个文件,不知道为什么。
哪位大侠能帮助解释一下么?谢谢。

...全文
189 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
riceconjee_chy 2010-10-21
  • 打赏
  • 举报
回复
这样说吧,libqtgui.so是连名,libqtgui.so.4是搜名,libqtgui.so.4.7.0是实名,其中前两个是链接,后一个是真正的文件。在程序链接时,指定的是连名,编译系统是如何转换为搜名的?还有,为什么要转换为搜名?直接转换为实名不行么?
riceconjee_chy 2010-10-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 oyster2008 的回复:]

我的意思是看下你可执行程序依赖的是什么库文件
引用 10 楼 riceconjee_chy 的回复:

我是通过桌面右键点击鼠标查看的两个链接的链接目标文件,显示都是libqtgui.so.4.7.0
[/Quote]
没错,程序显示的是libqtgui.so.4,可是我的问题是,编译系统怎么弄的,把我在连接时指定的libqtgui.so换成libqtgui.so.4的呢?
riceconjee_chy 2010-10-21
  • 打赏
  • 举报
回复
没错,程序显示的是libqtgui.so.4,可是我的问题是,编译系统怎么弄的,把我在连接时指定的libqtgui.so换成libqtgui.so.4的呢?
qixing1115 2010-10-21
  • 打赏
  • 举报
回复
晕晕晕晕晕晕晕
oyster2008 2010-10-21
  • 打赏
  • 举报
回复
我的意思是看下你可执行程序依赖的是什么库文件
[Quote=引用 10 楼 riceconjee_chy 的回复:]

我是通过桌面右键点击鼠标查看的两个链接的链接目标文件,显示都是libqtgui.so.4.7.0
[/Quote]
riceconjee_chy 2010-10-21
  • 打赏
  • 举报
回复
我是通过桌面右键点击鼠标查看的两个链接的链接目标文件,显示都是libqtgui.so.4.7.0
oyster2008 2010-10-21
  • 打赏
  • 举报
回复
你是怎么知道程序运行时找的是哪个库?你用ldd看看你的程序依赖的是哪个库文件
riceconjee_chy 2010-10-21
  • 打赏
  • 举报
回复
yangzhifu兄弟,可是我查看的libqtgui.so与libqtgui.so.4两个都是链接,都指向 libqtgui.so.4.7.0这个真正的库文件啊。
yangzhifu 2010-10-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 oyster2008 的回复:]

QtGui.so只是一个符号链接,该链接指向QtGui.so.4,在程序进行链接的时候,已经通过符号链接找到了QtGui.so.4并且只依赖它了,所以程序运行时QtGui.so存不存在都没关系
[/Quote]

赞同.............
riceconjee_chy 2010-10-21
  • 打赏
  • 举报
回复
我的意思是,在整个编译链接过程中我根本没有指定关于libqtgui.so.4的信息,编译系统通过什么把libqtgui.so与libqtgui.so.4结合起来的?而且两个都是链接。
riceconjee_chy 2010-10-21
  • 打赏
  • 举报
回复
也就是说,从一个链接指向了另一个链接,如果将qtgui.so.4删除,运行程序时会报找不到qtgui.so.4的错误。
riceconjee_chy 2010-10-21
  • 打赏
  • 举报
回复
qtgui.so与qtgui.so.4都是符号链接,这个知道,它们都指向qtgui.so.4.7.0。这个就奇怪了。为什么呢?
oyster2008 2010-10-21
  • 打赏
  • 举报
回复
QtGui.so只是一个符号链接,该链接指向QtGui.so.4,在程序进行链接的时候,已经通过符号链接找到了QtGui.so.4并且只依赖它了,所以程序运行时QtGui.so存不存在都没关系
guoxuqu 2010-10-21
  • 打赏
  • 举报
回复
libQTGui.so.4也是共享库QtGui,只不过版本号是4
riceconjee_chy 2010-10-21
  • 打赏
  • 举报
回复
真是谢谢oyster2008这位仁兄了,写了这么多,这么好。非常感谢。感觉连名转换为搜名还是需要通过实名文件中的字段来实现,绕了一圈子,绕糊涂了,谢谢了。
oyster2008 2010-10-21
  • 打赏
  • 举报
回复
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,那么升级共享库后你的程序使用的还是老版本的库,没法使用升级后功能增强或者发生了变化的库。

[Quote=引用 14 楼 riceconjee_chy 的回复:]

这样说吧,libqtgui.so是连名,libqtgui.so.4是搜名,libqtgui.so.4.7.0是实名,其中前两个是链接,后一个是真正的文件。在程序链接时,指定的是连名,编译系统是如何转换为搜名的?还有,为什么要转换为搜名?直接转换为实名不行么?
[/Quote]

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧