2016-05-12 58 views
0

我幾乎還是一個初學者程序員。但我想做Linux開發。然而,我所有的大學課程(除Java之外)都是面向Windows的。所以我們從來不需要做任何包裝。但我想打包我的Linux程序(Deb,也許RPM)。Linux開發:如何知道我自己的程序有哪些依賴關係?

我想知道,是否有任何工具可以掃描我的源代碼並提供依賴關係?

什麼是'hello world'C程序的依賴關係? 什麼是'hello world'Java程序的依賴關係? 有沒有任何教程來識別你自己的依賴?

+0

我認爲你需要選擇一種語言,並瞭解它的軟件包管理器 - 開始你可以看看Java的Maven – Lee

+0

如果你的問題是'我如何學習什麼庫可用於我的語言使用?',那麼我恐怕只是帶着經驗來。這不是一個真正的'建議' - 更多的是'定義'。 – Lee

+0

您是否在嘗試製作rpm或deb包: – padippist

回答

0

一般來說,你會知道你的程序的依賴關係,因爲你主動從庫中選擇#include頭。如果頭文件來自名爲libfoo-dev的Debian軟件包,則運行時相關性通常爲libfoo。另外,您需要使用system/execve調用的可執行文件,因爲它們需要在運行時安裝在系統上才能運行。

對於Java而言,它與此類似,因爲您依賴於可能添加到存儲庫的任何jar文件。如果您使用Maven或Gradle等構建系統,則您將擁有Maven/Gradle在編譯和運行時意識到並獲取的一組依賴關係。同樣,您使用ProcessBuilder調用的任何JNI庫+綁定或可執行文件也都是依賴項。

1

對於編譯的二進制文件,請看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包。

注意這種方式,你只會發現一種特定的依賴關係。 如果沒有任何庫,您的二進制文件將不會啓動,但可能會有其他依賴項不是動態庫。尤其是,如果可執行文件試圖從其他軟件包的文件中打開(),dlopen(),exec()或調用system(),則在ldd輸出中將看不到該文件。

即使圖書館,ldd不關心間接依賴關係,它只是列出了所有加載的內容。使用類似readelf -d hello | grep NEEDED的東西可能會澄清一些事情。

某些軟件包管理器(RPM)在製作軟件包時會執行此類檢查,並添加找到的所有依賴項。其他人沒有。

相關問題