社区
Linux/Unix社区
帖子详情
请教共享库运行时加载的问题
shager
2012-06-05 05:03:55
写了一个共享库,其中用到了其他的共享库(隐式链接),最后运行的时候,这个共享库在搜索其他共享库的时候,执着的去搜索编译时候指定的共享库的链接路径;如果建立一个和编译时一样的路径,能够正常的搜索到其他依赖共享库。可是在实际运行的时候,依赖共享库和编译时链接的路径不一样。无论我用LD_LIBRARY_PATH环境变量还是用ldconfig,或是把依赖共享库复制到/usr/lib目录下,都提示找不到, 隐式链接的共享库只能在链接的路径去搜索吗?
...全文
226
15
打赏
收藏
请教共享库运行时加载的问题
写了一个共享库,其中用到了其他的共享库(隐式链接),最后运行的时候,这个共享库在搜索其他共享库的时候,执着的去搜索编译时候指定的共享库的链接路径;如果建立一个和编译时一样的路径,能够正常的搜索到其他依赖共享库。可是在实际运行的时候,依赖共享库和编译时链接的路径不一样。无论我用LD_LIBRARY_PATH环境变量还是用ldconfig,或是把依赖共享库复制到/usr/lib目录下,都提示找不到, 隐式链接的共享库只能在链接的路径去搜索吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
qq120848369
2012-06-07
打赏
举报
回复
[Quote=引用 13 楼 的回复:]
杯具的就是放到这两个目录也提示找不到,除非编译时候共享库的路径就在这两个位置,那么就能找到
引用 12 楼 的回复:
export LD_LIBRARY_PATH=xxx 指定动态库目录,否则就应该将所有动态库放到/usr/lib,/usr/local/lib下,这样才会被查找到。
[/Quote]
是的,首先编译时候要指定动态库的目录,其次LD_LIBRARY_PATH要和那个指定的目录一致。具体原因我也不明白为什么会和动态库目录位置相关。
shager
2012-06-07
打赏
举报
回复
杯具的就是放到这两个目录也提示找不到,除非编译时候共享库的路径就在这两个位置,那么就能找到
[Quote=引用 12 楼 的回复:]
export LD_LIBRARY_PATH=xxx 指定动态库目录,否则就应该将所有动态库放到/usr/lib,/usr/local/lib下,这样才会被查找到。
[/Quote]
shager
2012-06-07
打赏
举报
回复
首先感谢你的回复,现在大概能够解决上述问题了,但是原来还是不太清楚。
在codeblocks里面使用了绝对路径来指定共享库,codeblocks会分析这些库,如果不是标准的库,则会用-Wl,-soname, /path/libXXX.so 来编译,结果就成了前面描述的,用ldd和readelf看到的依赖库(非标准的)就带了绝对路径。如果在codeblocks设置共享库搜索路径,然后在需要加链接库的位置填上去掉前面的lib和后面的.so后剩下的那部分,也就是-l参数的要求,然后编译出来的共享库就正常了。 后来直接用 g++分别配合-Wl,-soname 和 -lXXX编译选项来编译,结果是一样的。
[Quote=引用 14 楼 的回复:]
引用 13 楼 的回复:
杯具的就是放到这两个目录也提示找不到,除非编译时候共享库的路径就在这两个位置,那么就能找到
引用 12 楼 的回复:
export LD_LIBRARY_PATH=xxx 指定动态库目录,否则就应该将所有动态库放到/usr/lib,/usr/local/lib下,这样才会被查找到。
是的,首先编译时候要指定动态库的目录,其次LD_LIBRAR……
[/Quote]
justkk
2012-06-06
打赏
举报
回复
LIBPATH 这个环境变量是否有用?
shager
2012-06-06
打赏
举报
回复
简单的说,就是程序只认编译时共享库的路路径,就是放到/usr/lib都提示找不到,用ldd也是提示notfound
shager
2012-06-06
打赏
举报
回复
肯定是有问题才提的,还麻烦知道的老大们指点一下。
shager
2012-06-06
打赏
举报
回复
没有发过同样的问题吧?
qq120848369
2012-06-06
打赏
举报
回复
export LD_LIBRARY_PATH=xxx 指定动态库目录,否则就应该将所有动态库放到/usr/lib,/usr/local/lib下,这样才会被查找到。
shager
2012-06-06
打赏
举报
回复
ukz@ubuntu:~/TradeBlazer/TradeServer$ ldd ./teller/libTellerHSN.so
linux-gate.so.1 => (0xb77bd000)
/usr/lib/libhsfutusdk.so (0xb73d0000)
/usr/lib/libt2sdk.so (0xb735e000)
没有 "=>"
libIce.so.34 => /usr/lib/libIce.so.34 (0xb70a6000)
libIceBox.so.34 => /usr/lib/libIceBox.so.34 (0xb706a000)
libIceUtil.so.34 => /usr/lib/libIceUtil.so.34 (0xb702a000)
libIceStorm.so.34 => /usr/lib/libIceStorm.so.34 (0xb6ff0000)
libGlacier2.so.34 => /usr/lib/libGlacier2.so.34 (0xb6f4c000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb6e66000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb6e48000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6ca3000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb6c88000)
libt2sdk.so => /usr/local/lib/libt2sdk.so (0xb6c16000)
libuuid.so.1 => /lib/i386-linux-gnu/libuuid.so.1 (0xb6c0f000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb6be3000)
libcrypto.so.4 => /usr/lib/libcrypto.so.4 (0xb6a65000)
libssl.so.4 => /usr/lib/libssl.so.4 (0xb6a16000)
libbz2.so.1.0 => /lib/i386-linux-gnu/libbz2.so.1.0 (0xb6a05000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb69ff000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb69f6000)
/lib/ld-linux.so.2 (0xb77be000)
shager
2012-06-06
打赏
举报
回复
不知道是不是和共享库的生成方式有关,因为链接libIce.so.34和libhsfutusdk.so是用的同样的方式,只不过用ldd现实的时候,查不到的那些共享库都没有形如 libXXX=>/path/libXXX的格式,只有单独一个路径。
shager
2012-06-06
打赏
举报
回复
用的是codeblocks和gcc,具体的编译选项看不出来。
justkk
2012-06-06
打赏
举报
回复
那你是如何编译的?命令行是怎样的
shager
2012-06-06
打赏
举报
回复
也没有用,用readelf -d查看,这些找不到的依赖库是带有路径的,而其他的一些标准库,就是不带路径的,是不是和这个有关系? 如果和这个有关,那又该如何解决,谢谢了
Dynamic section at offset 0x32ced0 contains 31 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libIce.so.34]
0x00000001 (NEEDED) Shared library: [libIceBox.so.34]
0x00000001 (NEEDED) Shared library: [libIceUtil.so.34]
0x00000001 (NEEDED) Shared library: [libIceStorm.so.34]
0x00000001 (NEEDED) Shared library: [libGlacier2.so.34]
0x00000001 (NEEDED) Shared library:
[/home/liukz/svn/TBPlatformServer/ThirdPart/bin/HSN/linux.i386
/libhsfutusdk.so]
0x00000001 (NEEDED) Shared library: [libstdc++.so.6]
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x0000000c (INIT) 0x18e66c
0x0000000d (FINI) 0x2a24e8
0x00000019 (INIT_ARRAY) 0x32ddfc
0x0000001b (INIT_ARRAYSZ) 192 (bytes)
0x6ffffef5 (GNU_HASH) 0x138
0x00000005 (STRTAB) 0x382ec
0x00000006 (SYMTAB) 0x1300c
0x0000000a (STRSZ) 809442 (bytes)
0x0000000b (SYMENT) 16 (bytes)
0x00000003 (PLTGOT) 0x32dff4
0x00000002 (PLTRELSZ) 16 (bytes)
0x00000014 (PLTREL) REL
0x00000017 (JMPREL) 0x18e65c
0x00000011 (REL) 0x1027dc
0x00000012 (RELSZ) 573056 (bytes)
0x00000013 (RELENT) 8 (bytes)
0x00000016 (TEXTREL) 0x0
0x6ffffffe (VERNEED) 0x10272c
0x6fffffff (VERNEEDNUM) 3
0x6ffffff0 (VERSYM) 0xfdcce
0x6ffffffa (RELCOUNT) 7146
0x00000000 (NULL) 0x0
引用 5 楼 的回复:
LIBPATH 这个环境变量是否有用?
shager
2012-06-06
打赏
举报
回复
也没有用,用readelf -d查看,这些找不到的依赖库是带有路径的,而其他的一些标准库,就是不带路径的,是不是和这个有关系? 如果和这个有关,那又该如何解决,谢谢了
Dynamic section at offset 0x32ced0 contains 31 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libIce.so.34]
0x00000001 (NEEDED) Shared library: [libIceBox.so.34]
0x00000001 (NEEDED) Shared library: [libIceUtil.so.34]
0x00000001 (NEEDED) Shared library: [libIceStorm.so.34]
0x00000001 (NEEDED) Shared library: [libGlacier2.so.34]
0x00000001 (NEEDED) Shared library:
[/home/liukz/svn/TBPlatformServer/ThirdPart/bin/HSN/linux.i386/
libhsfutusdk.so]
0x00000001 (NEEDED) Shared library: [libstdc++.so.6]
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x0000000c (INIT) 0x18e66c
0x0000000d (FINI) 0x2a24e8
0x00000019 (INIT_ARRAY) 0x32ddfc
0x0000001b (INIT_ARRAYSZ) 192 (bytes)
0x6ffffef5 (GNU_HASH) 0x138
0x00000005 (STRTAB) 0x382ec
0x00000006 (SYMTAB) 0x1300c
0x0000000a (STRSZ) 809442 (bytes)
0x0000000b (SYMENT) 16 (bytes)
0x00000003 (PLTGOT) 0x32dff4
0x00000002 (PLTRELSZ) 16 (bytes)
0x00000014 (PLTREL) REL
0x00000017 (JMPREL) 0x18e65c
0x00000011 (REL) 0x1027dc
0x00000012 (RELSZ) 573056 (bytes)
0x00000013 (RELENT) 8 (bytes)
0x00000016 (TEXTREL) 0x0
0x6ffffffe (VERNEED) 0x10272c
0x6fffffff (VERNEEDNUM) 3
0x6ffffff0 (VERSYM) 0xfdcce
0x6ffffffa (RELCOUNT) 7146
0x00000000 (NULL) 0x0
[Quote=引用 5 楼 的回复:]
LIBPATH 这个环境变量是否有用?
[/Quote]
qq120848369
2012-06-05
打赏
举报
回复
时隔数月之后,楼主再次提出同样的问题,用意何在?
asp.net知识
库
asp.net 运行机制初探(httpModule
加载
) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托:一个C#睡前故事 [推荐] - [原创] Microsoft .NET策略及框架概述 ...
DOS 软盘+光盘+U盘+硬盘+NTFS 想拥有更强大的DOS功能??
③要运行光盘上的程序必须在启动时选择
加载
光驱驱动,否则无法转换到光驱的盘符。 你需要的文件都加好之后,就可以刻录光盘了(如下图): 完成后你就有了一张自己的DOS启动光盘喽。 5、将该光盘放入...
QT5生成和使用静态
库
动态
库
又称为
共享
库
,是在运行的时候
加载
使用的,所以在程序运行的时候还是需要动态
库
存在的。二:QT5静态
库
的生成在QT开发中有一些经常用的公用函数,我们没有必要每一次都在开发中再写一遍,只需要把他们编译成...
Unity大场景数据
加载
及优化方案
前段时间,有几个虚拟仿真公司跟我
请教
关于大地形的
加载
优化
问题
,它们使用的引擎都是自己研发的,引擎对于开发者来说,大同小异,它们的基本构造是一样的,关键是在于解决
问题
的方法,正是基于这个前提写了这个课程...
C程序的生成、
加载
、运行
下午试验一个小程序来着,用到size 命令,后来发现只是一个空程序体的话,size 命令仍然显示编译出的a.out 的bss 段大小有四个字节,于是去...第一个帖子详细说了可运行程序的磁盘映像、内存映像、进程地址空间的内容
Linux/Unix社区
23,125
社区成员
74,509
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章