回覆列表
  • 1 # 使用者6782741201988

    你可以參考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,效果差不多:

  • 中秋節和大豐收的關聯?
  • 為什麼生物有的卵生有的胚胎生?