猿问

库部署与未使用的直接依赖关系

我试图找出Qt Assistant需要部署哪些库。我ldd在Linux上使用过此功能。


我发现ldd提供了-u“打印未使用的依赖项”的选项。听起来好像有某种依赖(部署)并不需要(总是)。所以我又运行了两个ldd命令:


~$ ldd -u ~/Qt/5.10.0/gcc_64/bin/assistant 

Unused direct dependencies:

        /lib/x86_64-linux-gnu/libQt5Network.so.5

        /lib/x86_64-linux-gnu/libQt5Sql.so.5

        /lib/x86_64-linux-gnu/mesa/libGL.so.1

        /lib/x86_64-linux-gnu/libpthread.so.0

        /lib/x86_64-linux-gnu/libm.so.6

        /lib/x86_64-linux-gnu/libgcc_s.so.1


~$ ldd -r -u ~/Qt/5.10.0/gcc_64/bin/assistant 

Unused direct dependencies:

        /lib/x86_64-linux-gnu/libQt5Network.so.5

        /lib/x86_64-linux-gnu/mesa/libGL.so.1

        /lib/x86_64-linux-gnu/libpthread.so.0

        /lib/x86_64-linux-gnu/libm.so.6

        /lib/x86_64-linux-gnu/libgcc_s.so.1

我试图找出正在发生的事情,但我并不完全了解。

我的问题是:

  • 什么是未使用的直接依赖项(这对我来说是矛盾的)?

  • 是否有可能找出Qt Assistant实际上是否需要未使用的直接依赖项(然后再启动它并等待错误)?

  • 上面的命令行之间到底有什么区别?为什么
    第一个列表不包含第二个列表libQt5Sql


慕少森
浏览 283回答 1
1回答

米脂

由于-u开关,它正在打印。在ldd的手册页中-u, --unused          Print unused direct dependencies.  (Since glibc 2.3.4.)什么是未使用的直接依赖项(这对我来说是矛盾的)?这是恕我直言->库您建立二进制文件,这是没有必要的。IEgcc -L<LD_PATH> -Wall -o assistant assistant.c -lA -lB -lC它将所有ABC列为依赖项,但它们可能实际上未以二进制形式使用。主要原因是Makefile中通用LDFLAGS。是否可以找出Qt Assistant是否确实需要未使用的直接依赖项(然后再启动它并等待错误)?不,我认为,只有在调用特定函数时才可以使用它。还有机会您可以使用此功能,不会看到错误。不过,如果您决定这样做。有一种疯狂的方式。列出所有调用的函数,然后检查需要哪些所有库。(不确定这一点,但我认为基于类似的逻辑ldd可以打印此内容。)根据手册页ldd可能运行二进制文件。因此,基本上可以说是您提到的一种情况。但不广泛。 Be aware,  however,  that  in some circumstances, some versions of ldd may attempt to obtain the dependency information by directly  executing  the program.  Thus, you should never employ ldd on an untrusted executable, since this may result in the execution  of  arbitrary  code.上面的命令行之间到底有什么区别?为什么第一个列出libQt5Sql但第二个没有列出?差异是 -r       -r, --function-relocs          Perform relocations for both data  objects  and  functions,  and          report any missing objects or functions (ELF only).简而言之,它处理加载的库函数。建议使用ldd -u -r在这个错误在RedHat。
随时随地看视频慕课网APP
我要回答