如何製作一個可移植的 Linux 應用程序?
我想製作 Emacs 24.3 的“便攜”版本。我正在使用一些沒有 root 訪問權限的 Debian 7 系統。由於 Debian 7 缺少 Emacs 24,我想建構它的攜帶式版本,我可以將它放在 USB 拇指驅動器上隨身攜帶。我的具體問題是:
- 我可以使安裝前綴靈活,還是硬連線
configure --prefix=...
?- 如何將所有必需
.so
的文件與安裝捆綁在一起?
我有幾種方法可以做到這一點,首先是簡單的:
使安裝前綴靈活是很難的 - 我只是將安裝前綴設置為您的主目錄,或者您可以在任何機器上訪問的某個位置,然後使用
make install DESTDIR=/path/to/place/where/binaries/should/be/installed
將它們安裝到前綴以外的其他地方。
我個人有我的二進製文件
$HOME/bin
,所以我的命令看起來像這樣:./configure --prefix=$HOME
一些程序(我知道 FFmpeg 就是其中之一)可以使用編譯到程序中的所有庫來建構,避免共享庫。在 ffmpeg 的情況下(可能還有其他情況),配置標誌是
--disable-shared --enable-static
.您可以使用
ldd (name-of-binary-file)
它來檢查它需要哪些共享對象,並將它們複製到您的快閃記憶體驅動器。編輯 1
我剛剛做了一種方法來只獲取連結到的庫的名稱,這非常有幫助。
ldd binary-name|sed 's/=>.*//'|sed 's/\t//'|sed 's/\ (0x.*//'
將獲得連結到的所有庫的列表。
此外,這只會讓您獲得具有硬編碼路徑的文件:
ldd binary-name|sed 's/=>.*//'|sed 's/\t//'|sed 's/\ (0x.*//'|grep --color=never /
這是有效的,因為只有具有硬編碼路徑的庫通常在其名稱中帶有斜杠。它讓你知道在做下一個可能性時應該尋找什麼。
編輯 2
您可以使用
LD_PRELOAD
和/或LD_LIBRARY_PATH
從手動指定的庫中載入符號,從而消除下面提到的“硬編碼路徑”問題。如果您的庫有硬編碼的路徑,我聽說有一個名為
chrpath
可以更改執行路徑的工具。我已經(有限)成功地在十六進制編輯器中打開我的二進製文件並更改共享庫的路徑,只要它們比最初編譯的路徑短。它們必須以字元串終止符結尾。(在 C 中,這幾乎總是00
)。為了確保您有足夠的空間來更改路徑,我會(在我編譯它的系統上)將前綴設置為帶有符號連結的長得可笑的東西,如果您的庫位於/usr/lib
:sudo mkdir /OH_THIS_IS_A_VERY_VERY_VERY_VERY_VERY_LONG_DIRECTORY_NAME/ sudo ln -s /usr/lib /OH_THIS_IS_A_VERY_VERY_VERY_VERY_VERY_LONG_DIRECTORY_NAME/lib mkdir destdir ./configure --prefix=/OH_THIS_IS_A_VERY_VERY_VERY_VERY_VERY_LONG_DIRECTORY_NAME make make install DESTDIR=$PWD/DESTDIR
(
$PWD
順便說一下,是目前目錄。)這將為您提供足夠的空間來更改路徑。如果在實際路徑之後還有剩餘空間,則可以繼續添加
00
,直到到達通常空間的末尾。我只需要使用我為 Android 手機編譯的二進製文件,它ncurses
的路徑硬編碼到二進製文件中。我剛剛發現的最後一件事:你可以
ld-linux.so.*
通過添加這個來使位置不被硬編碼(適應你的系統的位置,執行類似的東西locate ld-linux
並找到一個類似於下面的:-Wl,--dynamic-linker=/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
到你的
LDFLAGS
變數。