java - Linux 开发 : How to know what are the dependencies of my own program?

标签 java c linux packaging

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

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

“hello world”C 程序的依赖项是什么? “hello world”Java 程序的依赖项是什么? 有没有识别自己依赖的教程?

最佳答案

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

> 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) 在制作包时会进行此类检查,并添加找到的所有依赖项。其他人没有。

关于java - Linux 开发 : How to know what are the dependencies of my own program?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37184030/

相关文章:

java - 创建一个在一周中的特定日期执行的触发器(Quartz Scheduler API)

Java:线程安全数据集实现

c++ - 内存占用分析

c++ - 为什么我在时间测量中会出现如此巨大的抖动?

linux - 如何创建一个脚本来 grep 用户的两个输入

linux - 使用mod_jk在apache和tomcat之间互通时无法连接到ajp端口

java - Kotlin Android/Java 字符串日期时间格式,API21

java - 计算器开关 Java 基础

c - 初学者C分配

c - 使用 Bison 时的错误