打包程序
方法一:(可以运行,但有报错Segmentation fault (core dumped))
参考
qt项目在Linux平台上面发布成可执行程序.run_qt.run不是虚拟机的配置文件-CSDN博客
Linux下Qt程序的打包发布(1)-不使用第三方工具 - 知乎 (zhihu.com)
过程
1、Release编译
先将你的程序在release下编译通过,保证下面打包的程序是你最新的。
2、新建一个文件夹(作为你希望运行的文件目录)
3、找到SeerScriptHttp
在bin/release下找到与你程序同名的。
将这个文件复制到你新建的文件夹里。
4、新建文件pack.sh
在第三步的文件下,新建文件pack.sh,内容如下
#!/bin/sh
exe="SeerScriptHttp" #你需要发布的程序名称
des="/home/xmuli/Desktop/temp/qwer" #创建文件夹的位置
deplist=$(ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }')
cp $deplist $des
5、新建SeerScriptHttp.sh文件
在第三步的文件下,再新建一个SeerScriptHttp.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 "$@"
我这里用了指定的appname:
#!/bin/sh
appname=SeerScriptHttp
dirname=`dirname $0`
tmp="${dirname#?}"
if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
$dirname/$appname "$@"
6、运行pack.sh
在第二步的文件终端里运行
sudo chmod 777 pcak.sh //赋值权限
sed -i 's/\r$//' pcak.sh //如果你是从window直接把.sh写好拖入ubuntu需要经过这一步,其他的不用执行这一步
sudo chmod 777 SeerScriptHttp.sh //赋值权限
sed -i 's/\r$//' SeerScriptHttp.sh
./pack.sh
会自动SeerScriptHttp.sh
讲所有依赖全部放入你指定的文件夹里
7.运行
在你的新建文件夹目录下执行
./SeerScriptHttp
运行的时候遇到这样的错误
error while loading shared libraries: libQtHttpServer.so.1: cannot open shared object file: No such file or directory
解决方法:
先看一下libQtHttpServer.so.1这个文件是否存在
find . -name libQtHttpServer.so.1
文件存在
将这个文件从这个路径复制
cp ./scriptManager/SeerScriptHttp/bin/release/gcc_x64/libQtHttpServer.so.1 /usr/local/lib/
然后进入/etc/ld.so.conf修改如下
vim /etc/ld.so.conf
###另起一行添加以下内容:
/usr/local/lib/
###保存退出
:wq
然后让资源修改生效
ldconfig
然后再运行./SeerScriptHttp
如果还有上述报错,就继续重复上面的操作(这里就不用再进入/etc/ld.so.conf修改了)直至没有类似报错。
方法二:linuxdeployqt (可行)
参考
使用linuxdeployqt在linux下进行Qt打包发布(超详细)-CSDN博客
根据上述参考安装linuxdeployqt
1. 下载linuxdeployqt
下载linuxdeployqt-x86_64.AppImage
下载地址:
https://github.com/probonopd/linuxdeployqt/releases
2. 安装linuxdeployqt
为了我们后面使用时,方便一点,我们把这长长的名字改短点吧:
mv linuxdeployqt-6-x86_64.AppImage linuxdeployqt
然后修改为可执行权限
chmod 777 linuxdeployqt
再把这个可执行文件扔进/usr/local/bin目录,这样,我们就可以在其他目录访问了
mv linuxdeployqt /usr/local/bin
测试是否安装成功
linuxdeployqt --version
输出版本信息,表示安装成功。
3. Qt库路径设置到环境变量
根据参考来,这里我qmake -v能查看到类似上图的结果,我就跳过了这一步。
4. 拷贝依赖文件
拷贝前,确认生成的是Release版本的程序,这个是常识。
我们在根目录下建立TestSetup目录,用于放置打包相关的文件;
并在TestSetup下继续建个Test目录,用来装Test应用及拷贝文件。
mkdir TestSetup
cd TestSetup
mkdir Test
把我们的应用Test(这个Test就是你自己的项目)拷贝到Test目录下
使用命令执行依赖文件拷贝
linuxdeployqt Test -appimage
终端报错(不用管它,是关于桌面文件的,后面我们直接编辑它。)
一会后,/TestSetup/Test目录下,已经把依赖全部拷贝好了。
我们可以看到创建了lib等目录。
需要说明的是,在执行“linuxdeployqt Test -appimage”命令时,其实除了拷贝依赖文件外,还对目标文件Test进行了修改,在Test中插入了一些库路径信息。
经过本人对前后2个文件内容的对比测试,至少是添加了lib目录的,其他没试过。
所以,你只需要把程序依赖的so文件放入lib目录下,无论是显式、隐式加载的so,都是可以搜索到的。
若你的应用中还有其他,如配置文件等资源,那么手动拷贝到你自己代码指定的目录下。
重要提示:
- 因为linuxdeployqt将在内部使用ldd命令,来确定从何处将库复制到包中。ldd命令本身只能查找隐式加载的so,故若程序中代码使用显式加载的so,它是找不到的,这时需要开发者自己去保证显式加载so的路径可被搜索。
- 举个例子:若存在程序A显式加载B.so,B.so隐式加载C.so,则对程序A使用linuxdeployqt拷贝依赖时,程序A的间接依赖文件C.so,将不会被拷贝。当程序跑起来加载B.so时,就会报找不到C.so的错误。这一点尤其需要注意。此时我们需要再对B.so使用一次linuxdeployqt拷贝依赖。这样程序A加载B.so,B.so加载C.so,就都可以找到了。、
5. 测试应用能否正常运行
此时,一个完整的运行环境已经具备了,我们测试一下。
重新开一个终端,在该终端的环境变量中去掉Qt库相关的路径,修改后的环境变量只对该终端生效,然后我们执行应用,看能否运行。
操作过程:先用export查看有哪些环境变量设置了Qt路径。
export
如果本教程之前没有配置过qt环境变量,那么结果应该和.bashrc文件我们追加的内容一致的。
然后把这些环境变量中Qt路径去掉(这里,我并没有遇到参考文章中说的,可能是因为我没有执行第三步)
测试启动应用
./Test
此时如果不出意外,应该可以正常启动。
如果有意外,那就根据实际情况,先把问题解决,再继续。
到这里就已经可以了,后面我就没有再看了。