你可以參考SQLiteStudio這個Qt寫的跨平臺SQLite管理工具,它自己打包了依賴的Qt庫,可以做到解壓即用,相容不同Linux發行版.道理其實跟Windows版Qt程式自帶Qt庫差不多.
編譯前給聯結器傳一個引數:
說明:
-Wl 表示告訴編譯器將後面的引數傳遞給連結器.
rpath是gcc的一個引數,當程式被載入時,會搜尋rpath目錄,尋找共享庫.
rpath新增的目錄資訊儲存在可執行檔案中.
$ORIGIN表示可執行檔案所在的目錄.
也就是執行時程式會先去自己所在的目錄的lib裡去載入依賴庫,沒有的話再去系統庫裡找.
如果你的程式在編譯時沒有傳遞rpath引數,那你也可以用patchelf來修改你程式的rpath:
注意:patchelf修改檔案後再strip會導致檔案損壞.
題外話,Android上既沒有glibc庫,也沒有庫連結器ld-linux.so.3.
如果你要把Debian ARM(如樹莓派Raspbian)上的軟體放到Android上跑,你一樣可以打包程式依賴的共享庫,讓程式也能跑在Android上,比如PHP:
也就是你把庫連結器ld-linux-armhf.so.3和PHP依賴的庫都放到/data/local/tmp/web/lib裡,然後設定個別名,就能在Android的adb shell裡執行樹莓派的PHP了.
當然,你也可以用patchelf設定PHP的interpreter和rpath,效果差不多:
你可以參考SQLiteStudio這個Qt寫的跨平臺SQLite管理工具,它自己打包了依賴的Qt庫,可以做到解壓即用,相容不同Linux發行版.道理其實跟Windows版Qt程式自帶Qt庫差不多.
編譯前給聯結器傳一個引數:
說明:
-Wl 表示告訴編譯器將後面的引數傳遞給連結器.
rpath是gcc的一個引數,當程式被載入時,會搜尋rpath目錄,尋找共享庫.
rpath新增的目錄資訊儲存在可執行檔案中.
$ORIGIN表示可執行檔案所在的目錄.
也就是執行時程式會先去自己所在的目錄的lib裡去載入依賴庫,沒有的話再去系統庫裡找.
如果你的程式在編譯時沒有傳遞rpath引數,那你也可以用patchelf來修改你程式的rpath:
注意:patchelf修改檔案後再strip會導致檔案損壞.
題外話,Android上既沒有glibc庫,也沒有庫連結器ld-linux.so.3.
如果你要把Debian ARM(如樹莓派Raspbian)上的軟體放到Android上跑,你一樣可以打包程式依賴的共享庫,讓程式也能跑在Android上,比如PHP:
也就是你把庫連結器ld-linux-armhf.so.3和PHP依賴的庫都放到/data/local/tmp/web/lib裡,然後設定個別名,就能在Android的adb shell裡執行樹莓派的PHP了.
當然,你也可以用patchelf設定PHP的interpreter和rpath,效果差不多: