Linux 打包 QT 程序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 打包 QT 程序相关的知识,希望对你有一定的参考价值。
参考技术A 打包平台:安装有QT开发环境的linux系统发布平台:未安装有QT开发环境的linux系统
以下使用到的路径需要根据自己环境不同进行修改:
qt安装路径:/opt/Qt5.12.5
freetype安装路径:/opt/Qt5.12.5/Tools/QtCreator/lib/Qt/lib/ //包含三个文件libfreetype.so、libfreetype.so.6、libfreetype.so.6.17.0
dbus安装路径:/opt/Qt5.12.5/Tools/QtCreator/lib/Qt/lib/ //包含三个文件libdbus-1.so、libdbus-1.so.3、libdbus-1.so.3.26.0
项目路径:/home/cs/Code/test/
项目名称:test
使用到的脚本文件:
copylib.sh
LibDir=$PWD"/lib"
Target=$1
lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))
$(mkdir $LibDir)
for Variable in $lib_array[@]
do
cp "$Variable" $LibDir
done
copylib2.sh
sudo cp /opt/Qt5.12.5/Tools/QtCreator/lib/Qt/lib/libfreetype.so ./
sudo cp /opt/Qt5.12.5/Tools/QtCreator/lib/Qt/lib/libfreetype.so.6 ./
sudo cp /opt/Qt5.12.5/Tools/QtCreator/lib/Qt/lib/libfreetype.so.6.17.0 ./
sudo cp /opt/Qt5.12.5/Tools/QtCreator/lib/Qt/lib/libdbus-1.so ./
sudo cp /opt/Qt5.12.5/Tools/QtCreator/lib/Qt/lib/libdbus-1.so.3 ./
sudo cp /opt/Qt5.12.5/Tools/QtCreator/lib/Qt/lib/libdbus-1.so.3.26.0 ./
test.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 "$@"
注意事项:该流程里的脚本都是777权限,如遇权限问题请使用 chmod 777 copylib.sh 命令
首先将程序release编译,在项目路径里找到编译生成的文件夹【build-Test-Desktop_Qt_5_12_5_GCC_64bit-Release】,在这个文件夹内(注意,很重要)建立 copylib.sh 脚本,并执行 ./copylib.sh test 。执行完成之后应该有一个lib文件夹,将lib文件夹内的所有内容和test程序复制到一个新的文件夹下【test-release】。
在QT安装目录下找到 【/5.12/gcc_64/plugins/platforms】 文件夹,建立 copylib.sh 脚本,并执行 ./copylib.sh libqxcb.so 。执行完成之后将这个 文件夹 复制到【test-release】文件夹中。然后在【test-release/platforms】文件夹中,将【test-release/platforms/lib】文件夹里的所有内容 剪切 到【test-release】文件夹里,并删除lib文件夹。
在【test-release】目录下建立 copylib2.sh 脚本,并执行 ./copylib2.sh 。
至此,所有所需的库文件应该都打包完毕。
在【test-release】目录下建立 test.sh 脚本,利用该脚本启动程序,启动命令为 ./test.sh 。
遗留问题点:
1.debug版本未测试,不知道是否可行。
2.platforms文件夹不仅在【/5.12/gcc_64/plugins/platforms】存在,还在【/Tools/QtCreator/lib/Qt/plugins/platforms】存在。在成功之前一直用的Tools目录下的,但是也有别的细节不一样,待考证。
3.脚本执行,或者说库的复制顺序似乎有关系。第一次copylib.sh 和 第二次copylib.sh 时会用一部分重叠。待考证哪个优先。
Qt程序发行Linux版,软件打包知识(patchelf 工具修改依赖库,确认 qmake -v 是自己使用的Qt版本,否则用export PATH进行修改)good
patchelf 工具可以修改已编译运行程序的依赖库位置和指定库链接器
patchelf --set-rpath
patchelf --set-interpreter
通过这个工具 https://github.com/probonopd/linuxdeployqt 如果自己编译不了,也可以下载现成的
https://github.com/probonopd/linuxdeployqt/releases
运行 ./linuxdeployqt-2-x86_64.AppImage ShanbayDict 并为成功,生成的 lib目录下的so文件很少。
运行 ./linuxdeployqt-2-x86_64.AppImage ShanbayDict -appimage 也未成功,但lib生成了很多so文件
使用 patchelf --set-rpath /opt/Qt-5.7-static/lib/:./lib ShanbayDict 修改 rpath后,ShanbayDict可以独立运行了,连同lib一起拷贝到新安装的Ubuntu 16.04系统中,也能运行了。
ldd ShanbayDict 显示,rpath已经指向 ./lib目录
patchelf可以通过 sudo apt install patchelf 安装
2017年2月24日
Qt 5.8编译的Qt程序
设置环境变量,确认 qmake -v 是自己使用的Qt版本,如果不是,解决办法是:
export PATH=/home/lieefu/Qt5.8.0/5.8/gcc_64/bin:$PATH
创建qml目录,把/home/lieefu/Qt5.8.0/5.8/gcc_64/qml 目录下用到的模块复制过来,我的app用到了三个 QtQuick、QtQuick.2、QtMultimedia。
增加plugin中platforminputcontexts 包括libfcitxplatforminputcontextplugin.so文件,就可以使用搜狗输入法录入汉字了
./linuxdeployqt-continuous-x86_64.AppImage LilyDict -appimage
这个命令要运行两边才行,解决这个bug https://github.com/probonopd/linuxdeployqt/issues/64
The libqxcb.so rpath hadn‘t been set correctly.
Running patchelf --set-rpath ‘$ORIGIN/../../lib‘ plugins/platforms/libqxcb.so
第二遍运行就对xcb库重新设置rpath
2017年3月2日,最新版本的linuxdeployqt-continuous-x86_64.AppImage,不需要运行两边了
https://my.oschina.net/lieefu/blog/756712
以上是关于Linux 打包 QT 程序的主要内容,如果未能解决你的问题,请参考以下文章
Qt ------ linux(ubuntu) 下用 linuxdeployqt 打包发布程序
winqt5打包qt程序打包成一个可执行文件(带图标任何win都可以运行哦)
QT4 Linux GUI应用程序如何把所需要的QT库一起打包,使其能在没有装QT4的Linux平台上运行??
Qt程序发行Linux版,软件打包知识(patchelf 工具修改依赖库,确认 qmake -v 是自己使用的Qt版本,否则用export PATH进行修改)good