【问题标题】:Linux development: How to know what are the dependencies of my own program?Linux开发:如何知道自己程序的依赖是什么?
【发布时间】:2016-05-12 10:20:02
【问题描述】:

我几乎还是一个初级程序员。但是我想做Linux开发。然而,我所有的大学课程(Java 课程除外)都是面向 Windows 的。所以我们从来不需要做任何包装。但我想为 Linux 打包我的程序(Deb 和 RPM)。

我想知道,是否有任何工具可以扫描我的源代码并建议依赖项?

“hello world”C 程序的依赖关系是什么? “hello world”Java 程序的依赖关系是什么? 有什么教程可以识别你自己的依赖关系吗?

【问题讨论】:

  • 我认为你需要选择一种语言并了解它的包管理器 - 开始你可以看看 Maven for Java
  • 如果您的问题是“我如何了解我正在使用的语言可以使用哪些库?”,那么恐怕只是有经验。这并不是真正的“建议”——更多的是“定义”。
  • 你是在做rpm包还是deb包:
  • '建议','定义'?在 Linux 上,它更像是一种“祈祷”。

标签: java c linux packaging


【解决方案1】:

对于已编译的二进制文件,请查看ldd。它显示用于加载可执行文件的动态库的文件名。您需要使用包管理器的某种 who-owners 命令来找出这些库属于哪些包。

> ldd hello
        linux-vdso.so.1 (0x00007fff7b5fb000)
        libc.so.6 => /usr/lib/libc.so.6 (0x00007fa6b1d96000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa6b2137000)

> pacman -Qo /usr/lib/libc.so.6 /lib64/ld-linux-x86-64.so.2
/usr/lib/libc.so.6 is owned by glibc 2.23-2
/usr/lib/ld-linux-x86-64.so.2 is owned by glibc 2.23-2

在这种情况下,唯一的依赖是glibc 包。

请注意,这样您只会找到一种特定类型的依赖项。 如果没有任何库,您的二进制文件将无法启动,但可能会有其他不是动态库的依赖项。特别是,如果可执行文件尝试对来自其他包的文件进行 open()、dlopen()、exec() 或调用 system(),您将不会在 ldd 输出中看到这些。

即使对于库,ldd 也不关心间接依赖,它只是列出加载的所有内容。使用readelf -d hello | grep NEEDED 之类的东西可能会澄清一些事情。

一些包管理器 (RPM) 在制作包时会进行此类检查,并添加找到的所有依赖项。其他人没有。

【讨论】:

    【解决方案2】:

    通常,您会知道程序的依赖关系,因为您主动选择#include 库中的标头。如果标头来自名为 libfoo-dev 的 Debian 软件包,则运行时依赖项通常为 libfoo。此外,您将依赖于使用 system/execve 调用的可执行文件,因为它们需要在运行时安装在系统上才能运行。

    对于 Java,情况类似,因为您依赖于您可能添加到存储库中的任何 jar 文件。如果您使用诸如 Maven 或 Gradle 之类的构建系统,您将已经拥有一组 Maven/Gradle 可以识别并获取的依赖项,以便在编译和运行时提供给您。同样,您使用 ProcessBuilder 调用的任何 JNI 库+绑定或可执行文件也是依赖项。

    【讨论】:

      猜你喜欢
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      • 2020-03-24
      • 2017-01-27
      相关资源
      最近更新 更多