百科问答小站 logo
百科问答小站 font logo



用到了高版本Qt库,但Ubuntu更新不到那么高的Qt版本,自己拷贝高版本Qt库过去又有问题,怎么办? 第1页

  

user avatar   eechen-php 网友的相关建议: 
      
       http://sqlitestudio.pl/files/sqlitestudio3/complete/     

你可以参考SQLiteStudio这个Qt写的跨平台SQLite管理工具,它自己打包了依赖的Qt库,可以做到解压即用,兼容不同Linux发行版.道理其实跟Windows版Qt程序自带Qt库差不多.

编译前给连接器传一个参数:

       export LDFLAGS="-Wl,-rpath,$ORIGIN/lib"     

说明:

-Wl 表示告诉编译器将后面的参数传递给链接器.

rpath是gcc的一个参数,当程序被加载时,会搜寻rpath目录,寻找共享库.

rpath添加的目录信息保存在可执行文件中.

$ORIGIN表示可执行文件所在的目录.

也就是运行时程序会先去自己所在的目录的lib里去加载依赖库,没有的话再去系统库里找.


如果你的程序在编译时没有传递rpath参数,那你也可以用patchelf来修改你程序的rpath:

       # 修改rpath patchelf --set-rpath '$ORIGIN/lib' --force-rpath your_app # 查看rpath patchelf --print-rpath your_app     

注意:patchelf修改文件后再strip会导致文件损坏.

所以应该先用strip删除符号表缩小二进制文件,然后再用patchelf设置rpath.


题外话,Android上既没有glibc库,也没有库链接器ld-linux.so.3.

如果你要把Debian ARM(如树莓派Raspbian)上的软件放到Android上跑,你一样可以打包程序依赖的共享库,让程序也能跑在Android上,比如PHP:

       alias php="/data/local/tmp/web/lib/ld-linux-armhf.so.3  --library-path /data/local/tmp/web/lib  /data/local/tmp/web/php"     

也就是你把库链接器ld-linux-armhf.so.3和PHP依赖的库都放到/data/local/tmp/web/lib里,然后设置个别名,就能在Android的adb shell里运行树莓派的PHP了.

当然,你也可以用patchelf设置PHP的interpreter和rpath,效果差不多:

       interpreter 对应 ld-linux.so rpath 对应 --library-path patchelf --set-interpreter '/data/local/tmp/web/lib/ld-linux-armhf.so.3' php patchelf --set-rpath '$ORIGIN/deps' --force-rpath php 其中 --set-interpreter 也可以使用相对路径,但不支持$ORIGIN.     



  

相关话题

  为什么 Windows 没有形成成熟的软件包和升级体系? 
  FreeBSD 还有前途吗? 
  Linux 下 “一切皆文件” 思想的本质和好处在哪里?与 Windows 下的文件管理思想有啥差别? 
  为什么 Windows 比 Linux 的文件搜索慢很多? 
  有人将linux作为主力机系统的么,说说为什么? 
  Linux 系统有没有关于 rm -rf /* 的保护机制? 
  安卓1.0明显是基于linux内核开发的,安卓1.0是不是linux套壳? 
  为什么不开发 Linux 上的傻瓜式桌面? 
  Fuchsia OS可以从Cast OS保留数据升级,是否说明Fuchsia只是Linux套壳? 
  华为 Linux 内核贡献者被质疑刷 KPI,真实情况是怎样的?有哪些信息值得关注? 

前一个讨论
现在 Qt 好找工作吗?
下一个讨论
如何评价锤子科技此次发布的坚果 TNT 工作站(显示器)?





© 2024-12-26 - tinynew.org. All Rights Reserved.
© 2024-12-26 - tinynew.org. 保留所有权利