linux下共享库的系统路径和查找

        在使用qvfb做framebuffer模拟的时候,发现几个问题:第一个就是ubuntu的确不专业,没有很多库的支持,最好使用redhat,fedora之类的发行版本,这样会少很多编译之类的麻烦.

        由于在ubuntu下编译qvfb缺少了很多库文件,而在没有网络的情况下,补齐这些库和头文件是非常麻烦的,所以准备在fedora中编译好后再放到ubuntu中使用.由于ubuntu和fedora下qtsdk的安装不一致,从而发现fedora下编译好的qvfb放到ubuntu下执行,发现找不到库.

        利用strace工具看一下这个过程,因为是在fedora下编译的,所以makefile中的链接选项有指明链接库的地址-rpath,这个地址就是sdk安装目录下的库目录.

        所以在fedora下直接打开这个目录,加载相应的库文件.而在ubuntu下sdk的安装目录不一致,系统的库搜索路径又没有这个库,所以执行肯定会报错.在ubuntu下strace下这个过程,就会发现有很多open /usr/lib之类的操作.

        man ld,该文档中给出了共享库的系统路径和查找优先级:

        The linker uses the following search paths to locate required
           shared libraries:


           1.  Any directories specified by -rpath-link options.


           2.  Any directories specified by -rpath options.  The difference
               between -rpath and -rpath-link is that directories specified by
               -rpath options are included in the executable and used at
               runtime, whereas the -rpath-link option is only effective at
               link time. Searching -rpath in this way is only supported by
               native linkers and cross linkers which have been configured
               with the --with-sysroot option.


           3.  On an ELF system, for native linkers, if the -rpath and
               -rpath-link options were not used, search the contents of the
               environment variable "LD_RUN_PATH".


           4.  On SunOS, if the -rpath option was not used, search any
               directories specified using -L options.


           5.  For a native linker, the search the contents of the environment
               variable "LD_LIBRARY_PATH".


           6.  For a native ELF linker, the directories in "DT_RUNPATH" or
               "DT_RPATH" of a shared library are searched for shared
               libraries needed by it. The "DT_RPATH" entries are ignored if
               "DT_RUNPATH" entries exist.


           7.  The default directories, normally /lib and /usr/lib.


           8.  For a native linker on an ELF system, if the file
               /etc/ld.so.conf exists, the list of directories found in that
               file.


           If the required shared library is not found, the linker will issue
           a warning and continue with the link.


          所以,如果要想在ubuntu下运行fedora下编译的qvfb,可以在/usr/lib下做一下qt库的链接,将其指向qtsdk安装目录的库目录下的库.这样,就可以运行了.其实在嵌入式qt开发中也是这样的:所有的动态库我们都放在/lib下,这样应用程序就都可以找到库了.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux系统中,共享的绝对路径可以通过以下方法获得: 1. 使用ldd命令 ldd命令可以列出一个可执行文件或共享所依赖的动态链接。通过ldd命令,我们可以获得共享的绝对路径。例如,我们可以使用以下命令来获取libssl.so.1.0.0共享的绝对路径: ``` ldd /usr/bin/openssl | grep libssl.so.1.0.0 ``` 该命令会输出类似下面的内容: ``` libssl.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007f3d3b0b2000) ``` 其中,/usr/lib/x86_64-linux-gnu/libssl.so.1.0.0就是libssl.so.1.0.0共享的绝对路径。 2. 使用objdump命令 objdump命令可以用于查看可执行文件或共享的符号表。通过objdump命令,我们可以找到共享的名称和版本号,然后根据这些信息来推断出共享的绝对路径。例如,我们可以使用以下命令来获取libssl.so.1.0.0共享的绝对路径: ``` objdump -p /usr/bin/openssl | grep NEEDED | grep libssl.so.1.0.0 | awk '{print $2}' ``` 该命令会输出类似下面的内容: ``` libssl.so.1.0.0 ``` 这个输出告诉我们,openssl可执行文件需要使用libssl.so.1.0.0共享。然后,我们可以使用以下命令来查找libssl.so.1.0.0共享的绝对路径: ``` find /usr -name "libssl.so.1.0.0" ``` 该命令会搜索系统中所有文件名为libssl.so.1.0.0的文件,并输出它们的绝对路径。 以上是两种获取共享绝对路径的方法,可以根据实际需要选择合适的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值