我基本上还是一个初级程序员。但是我想做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/