Qt在Linux下的部署 (二)
创建应用程序包
在(类)Unix系统中并没有标准的包管理工具,接下来介绍的方法是一个较为通用的解决方案。你可以阅读特定主机系统上关于创建包的更多信息。
部署应用程序,相关的Qt库(在应用中使用的Qt模块),平台插件,和可执行文件的副本需在同一目录层次下。如果你的应用依赖于特定的编译库,这些库需与你的应用一同重新发布。获取更多信息,查看应用依赖关系部分。
接下来,我们将介绍关于插件的主题,但是目前主要的问题是,你必须保证动态链接器能够找到Qt库文件(当Qt以共享方式安装时)。除非另外说明,动态链接器不会到应用的目录下搜索(文件)。解决此问题,有很多方式:
1.你可以在系统路径下安装Qt库(例如:在多数的系统中 /usr/lib)
在(类)Unix系统中并没有标准的包管理工具,接下来介绍的方法是一个较为通用的解决方案。你可以阅读特定主机系统上关于创建包的更多信息。
部署应用程序,相关的Qt库(在应用中使用的Qt模块),平台插件,和可执行文件的副本需在同一目录层次下。如果你的应用依赖于特定的编译库,这些库需与你的应用一同重新发布。获取更多信息,查看应用依赖关系部分。
接下来,我们将介绍关于插件的主题,但是目前主要的问题是,你必须保证动态链接器能够找到Qt库文件(当Qt以共享方式安装时)。除非另外说明,动态链接器不会到应用的目录下搜索(文件)。解决此问题,有很多方式:
1.你可以在系统路径下安装Qt库(例如:在多数的系统中 /usr/lib)
2.你可以向-rpath 命令行选项传递一个预先设定的路径,当应用开始时,动态链接器会到该路径下去查找(相应文件)
3.你可以为应用写一个启动脚本,在脚本中更改你的动态链接器配置(例如:将你的应用目录添加到LD_LIBRARY_PATH环境变量中 )
备注:如果你的应用在运行时需要设置文件的"set user-id on execution"位(S_ISUID 04000 在文件执行时把进程的属主或组ID置为该文件的文件属主)或者需以root身份运行,在某些平台上,设置环境变量的方法就不可行了。
第一种方法的不足之处是用户需有超级用户权限。第二种方式的不足之处,在于用户可能没有足够的权限(将应用)安装到预定义的路径下。不论哪种情况,用户均无法在自己的主目录下安装应用。我们推荐使用更具灵活性的第三种方法,例如,plugandpaint.sh 脚本可以像这样:
#!/bin/sh
appname=`basename $0 | sed s,\.sh$,,`
dirname=`dirname $0`
tmp="${dirname#?}"
if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
$dirname/$appname "$@"
运行此脚本而不是可执行文件,可以确保动态链接器找到Qt库。备注,你可以将此脚本重命名后,用于其它应用。
应用运行时会在应用目录下的插件(plugins)子目录中搜索相应插件。你可以将插件复制到插件(plugins)目录中,或是在插件(plugins)目录的项目文件中设置DESTDIR变量值。
DESTDIR = /path/to/Qt/plugandpaint/plugins
一个应用文档(应用发布包)应包含 运行 Plug & Paint 应用的Qt库,和所有的插件组。文件清单列表如下:
Component(组件) | File Name(文件名) | |
---|---|---|
The executable | plugandpaint | |
The script to run the executable | plugandpaint.sh | |
The Basic Tools plugin | plugins\libpnp_basictools.so | |
The ExtraFilters plugin | plugins\libpnp_extrafilters.so | |
The Qt xcb platform plugin | platforms\libqxcb.so | |
The Qt Core module | libQt5Core.so.5 | |
The Qt GUI module | libQt5Gui.so.5 | |
The Qt Widgets module | libQt5Widgets.so.5 |
在大多数的系统中,共享库的扩展名是.so 。一个例外是在HP-UX系统下,扩展名是.sl 。
如果你的应用依赖于特定的编译库,这些库应随应用一同重新发布。获得更多信息,阅读应用依存关系部分。
检验应用是否已被成功的部署,你可以在没有安装Qt和任何编译器的主机上,解压缩应用包,然后尝试运行。例如,可以运行plugandpaint.sh脚本。
另外一种可选的添加搜索路径的方法,是在程序运行时使用QApplication::addLibraryPath() 或者是 lication::setLibraryPaths()函数。
qApp->addLibraryPath("/some/other/path");