Qt+Ubuntu20.04:打包qt

Linux下Qt程序打包与依赖管理:方法与解决方案

打包程序

方法一:(可以运行,但有报错Segmentation fault (core dumped))【是个坑!!!!】

参考

qt项目在Linux平台上面发布成可执行程序.run_qt.run不是虚拟机的配置文件-优快云博客

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打包发布(超详细)-优快云博客

根据上述参考安装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

此时如果不出意外,应该可以正常启动。

如果有意外,那就根据实际情况,先把问题解决,再继续。

到这里就已经可以了,后面我就没有再看了。

### 安装和使用 Notepad++ on Ubuntu 20.04 #### 使用 Wine 运行 Windows 版本的 Notepad++ 由于 Notepad++ 是一款原生于 Windows 的编辑器,在 Linux 上可以通过 Wine 来运行它。以下是具体操作方法: 安装必要的依赖包,包括 `software-properties-common` 和设置 WineHQ 存储库: ```bash sudo apt update && sudo apt upgrade -y sudo dpkg --add-architecture i386 wget -nc https://dl.winehq.org/wine-builds/winehq.key sudo apt-key add winehq.key sudo apt-add-repository 'deb http://dl.winehq.org/wine-builds/ubuntu/ focal main' ``` 更新 APT 缓存并安装 Wine 稳定版[^2][^3]: ```bash sudo apt update sudo apt install --install-recommends winehq-stable ``` 下载 Notepad++ 并通过 Wine 执行安装程序: ```bash cd ~/Downloads/ wget https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v7.9.5/npp.7.9.5.Installer.x64.exe wine npp.7.9.5.Installer.x64.exe ``` 启动已安装的应用程序可以简单地键入命令: ```bash wine ~/.wine/drive_c/Program\ Files/Notepad++/notepad++.exe ``` #### 替代方案:安装 Native 应用程序 对于那些希望获得更流畅体验的人来说,可以选择安装基于 GTK 或 Qt 开发的本地文本编辑器作为替代品。 例如 Atom、Visual Studio Code 或者 Sublime Text 都是非常优秀的跨平台代码编辑工具;而 Gedit 则是 GNOME 桌面环境自带的文字处理软件。 如果确实偏好 Notepad++ 的界面风格,则推荐尝试安装其开源克隆项目——[Notepadqq](https://notepadqq.allen2l.me/) ,这是一个专门为 Linux 设计的支持多标签页的强大文本编辑器。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值