Gcc
建構包含靜態對象的二進製文件
是否可以建構包含相關 .so 文件的二進製文件,以便可以建構一次二進製文件並在具有相同硬體和作業系統的機器上使用,而無需它們具有 .so 文件?
例如,我正在使用 nghttp2 建構 curl。我願意
./configure --with-nghttp2=/usr/local
然後我跑了make。我得到了 curl 二進製文件。當我將此二進製文件複製到另一台機器上並嘗試執行它時,它說
./curl: error while loading shared libraries: libnghttp2.so.14: cannot open shared object file: No such file or directory
我還嘗試按如下方式執行 make:
make SHARED=0 CFLAGS='-static'
我仍然得到同樣的錯誤。
依賴 .so 文件可以是共享對象(它們是 .so 文件)或 .a 文件(即靜態對象)的形式。您可以重建 nghttp2 並將
--disable-shared
標誌傳遞給它的配置。然後你可以像往常一樣嘗試重新配置和重建 curl。關鍵是要確保 /usr/local/lib 中只有靜態 .a 對象可以連結 curl 。
不要忘記檢查 /usr/local/lib 不包含 nghttp2 的 .so 版本!(或者您可以指定另一個 –prefix= 進行試驗。您甚至可以將任何東西安裝到 /tmp 或您的 $HOME 並使用本地創建的樹)
請注意,這不會消除 curl 的其他依賴項,因為它是一個依賴於第三方程式碼的大型項目。它甚至可以依賴於自身,libcurl。您可以將
--disable-shared
標誌傳遞給它以僅建構它的靜態版本。最後,執行readelf -d /path/to/your/curl | fgrep NEEDED
以查看它的完整依賴項!