linux下Qt程序部署教程
文章目录
- @[toc]
- 1、概述
- 2、静态编译安装Qt
- 1.1 安装依赖
- 1.2 静态编译
- 1.3 报错
- 1.4 添加环境变量
- 1.5 下载安装QtCreator
- 3、配置linuxdeployqt环境
- 1.1 在线安装依赖
- 1.2 使用linuxdeployqt提供的程序
- 1.3 编译安装linuxdeployqt
- 4、使用linuxdeployqt打包依赖
- 1.1 linuxdeployqt使用选项
- 1.2 patchelf修改动态库搜索路径
- 1.3 验证
- 1.4 修改linuxdeployqt源码
- 5、使用appimagetool打包生成AppImage程序
- 特点
- 工作原理
- 1.1 安装appimagetool
- 1.2 appimagetool选项
- 1.3 打包AppImage工程
- 6、错误记录
- 7、参考
- 1.1 Qt
- 1.2 linuxdeployqt
- 1.3 appimage
- 8、视频
文章目录
- @[toc]
- 1、概述
- 2、静态编译安装Qt
- 1.1 安装依赖
- 1.2 静态编译
- 1.3 报错
- 1.4 添加环境变量
- 1.5 下载安装QtCreator
- 3、配置linuxdeployqt环境
- 1.1 在线安装依赖
- 1.2 使用linuxdeployqt提供的程序
- 1.3 编译安装linuxdeployqt
- 4、使用linuxdeployqt打包依赖
- 1.1 linuxdeployqt使用选项
- 1.2 patchelf修改动态库搜索路径
- 1.3 验证
- 1.4 修改linuxdeployqt源码
- 5、使用appimagetool打包生成AppImage程序
- 特点
- 工作原理
- 1.1 安装appimagetool
- 1.2 appimagetool选项
- 1.3 打包AppImage工程
- 6、错误记录
- 7、参考
- 1.1 Qt
- 1.2 linuxdeployqt
- 1.3 appimage
- 8、视频
更多精彩内容 |
---|
👉内容导航 👈 |
👉Qt开发经验 👈 |
1、概述
linux下打包部署Qt编译的程序主要有3种方法:
- 方法1:安装Qt时编译生成静态库,这样编译生成的程序就不会依赖于Qt库了,如果用到第三方动态库另说;
- 方法2:使用linuxdeployqt打包程序的依赖库;
- 方法3:使用linuxdeploy打包程序。
注意:
- 最好在低版本的LTS(长期支持)系统编译打包程序,这样打包的程序可以支持在低版本和高版本的系统运行,如果在高版本的系统编译打包,在低版本的系统可能不兼容。
测试环境
环境 | 版本 |
---|---|
系统 | ubuntu22.04 |
Qt | Qt5.14.2 |
linuxdeployqt | 2024-9-8版本 |
appimagetool | 3.10.5 |
2、静态编译安装Qt
如果已经通过Qt官方提供的安装包进行安装了动态版本的可以选择跳过这一节。
官方说明:
从Git构建Qt 5 - Qt Wiki
从Git构建Qt 6 - Qt Wiki
1.1 安装依赖
qt5.14.2
sudo apt-get install build-essential perl python3 git
# Libxcb 的sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev
# Qt WebKit(Qt WebKit)
sudo apt-get install flex bison gperf libicu-dev libxslt-dev ruby
# Qt Web引擎
sudo apt-get install libxcursor-dev libxcomposite-dev libxdamage-dev libxrandr-dev libxtst-dev libxss-dev libdbus-1-dev libevent-dev libfontconfig1-dev libcap-dev libpulse-dev libudev-dev libpci-dev libnss3-dev libasound2-dev libegl1-mesa-dev gperf bison nodejs
#Qt多媒体
sudo apt-get install libasound2-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev libgstreamer-plugins-bad1.0-dev
Qt6
sudo apt install libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util-dev libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev libfontconfig1-dev libfreetype-dev libx11-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-cursor-dev libxcb-glx0-dev libxcb-keysyms1-dev git cmake g++ gcc perl python libclang-dev libgl-dev libegl-dev libfontconfig1-dev libinput-dev
1.2 静态编译
Qt5
cd qtbase
mkdir build
cd build
# 编译静态库
../configure -developer-build -opensource -nomake examples -nomake tests --prefix=/opt/qt5.14.2/ -static -release
make -j8
make install
Qt6
mkdir build
cd build
../configure -developer-build -opensource -nomake examples -nomake tests --prefix=/opt/qt6.2.9/ -static -releasecmake --build . --parallel 8
cmake --install .
1.3 报错
- 错误
class numeric_limits<QT_PREPEND_NAMESPACE(qfloat16)> : public numeric_limits<float>
5.14.2/qtbase/include/QtCore/../../src/corelib/global/qfloat16.h:295:7: error: ‘numeric_limits’ is not a class template
295 | class numeric_limits<QT_PREPEND_NAMESPACE(qfloat16)> : public numeric_limits<float>
| ^~~~~~~~~~~~~~
- 解决办法:打开
qtbase/src/corelib/global/qglobal.h
,添加#include <limits>
;
#ifdef __cplusplus
# include <type_traits>
# include <cstddef>
# include <utility>
# include <limits>
#endif
1.4 添加环境变量
export PATH=/opt/qt5/bin:$PATH # 可执行程序环境变量
export LD_LIBRARY_PATH=/opt/qt5/lib:$LD_LIBRARY_PATH # 链接库环境变量
1.5 下载安装QtCreator
-
下载最新版本的Qt Creator安装包,也可以下载源码编译;
-
下载后使用
sudo chmod 777 ./qt-creator*.run
设置文件权限,然后使用sudo ./qt-creator-opensource-linux-x86_64-14.0.2.run
命令运行安装。 -
安装完成后配置编译器;
-
点击【工具】->【外部】->【配置】,打开【首选项】;
-
点击【Kit】->【Qt版本】->【添加】,找到自己编译安装的Qt安装路径下编译器中的QMake;
/opt/qt5/bin/qmake
;
-
然后选择【构建套件Kit】,点击【添加】;
- 编译器选择gcc/g++,调试器选择GDB,Qt版本选择刚才添加的qmake名称;
-
配置完成后创建一个工程,选择QMake,刚才添加的编译器就可以编译代码了。
3、配置linuxdeployqt环境
1.1 在线安装依赖
sudo apt install patchelf libfuse2
-
patchelf用于修改现有的ELF可执行文件和库(修改可执行程序去寻找动态库的路径,默认是从环境变量找);
-
libfuse2 Linux FUSE(用户空间中的文件系统)接口的参考实现。(可以不安装,如果linuxdeployqt运行提示缺失再安装)
1.2 使用linuxdeployqt提供的程序
- 下载linuxdeployqt可执行程序linuxdeployqt-continuous-x86_64.AppImage
- 使用
sudo chmod 777 linuxdeployqt-continuous-x86_64.AppImage
设置文件权限; - 然后使用
linuxdeployqt-continuous-x86_64.AppImage -version
命令检查程序是否可以运行,在高版本的ubuntu或者不支持的系统需要自己编译源码; - 注意:
- linux只提供了x86-64架构的可执行程序。
- 如果显示找不到Qt库则需要将Qt库的lib路径添加环境变量。
1.3 编译安装linuxdeployqt
- 下载linuxdeployqt源码;
- 解压后使用qt creator打开
linuxdeployqt.pro
文件;
- 注意: 如果ubuntu版本大于20.04则需要打开main.cpp文件,将
if (strverscmp (glcv, "2.32") >= 0)
判断功能注释掉;
-
注意: linuxdeployqt中调用appimagetool打包程序需要联网,appimagetool打包程序时会依赖于type2-runtime程序,如果没有安装runtime则使用linuxdeployqt每次运行都会从github下载runtime,速度慢,并且需要联网,如果没有联网或者无法访问github则打包第三步会失败,后续给出解决办法。
-
直接开始编译,然后在编译生成的build文件夹中的bin文件夹内找到
linuxdeployqt
;
- 使用命令
sudo cp linuxdeployqt /usr/local/bin/
将linuxdeployqt添加到环境变量可以找到的路径下; - 使用
linuxdeployqt -version
命令验证是否安装成功;
- 如果找不到显示错误如下:
- 使用命令
gedit ~/.bashrc
打开文件..bashrc
文件; - 添加Qt环境变量;
export LD_LIBRARY_PATH=/opt/Qt5.14.2/5.14.2/gcc_64/lib:$LD_LIBRARY_PATH
; - 然后保存关闭文件,使用
source .bashrc
使配置生效。
- 使用命令
linuxdeployqt: error while loading shared libraries: libQt5Core.so.5: cannot open shared object file: No such file or directory
4、使用linuxdeployqt打包依赖
linuxdeployqt工作流程:
- 将依赖库文件打包到当前路径下;
- 使用
patchelf
修改可执行程序查找动态库的路径;- 使用
appimagetool
将打包好的可执行程序和依赖库制作为AppImage程序。这三个步骤可以一步全部执行,也可以单独执行;
如果使用-appimage全部执行可能会报错,导致步骤中断;
如果执行第一步失败,则打包的依赖库不全,无法使用;
如果第一步执行完成,第二步失败,则依赖库打包完成,但是拷贝到其它电脑上后还是无法找到动态库,因为这时可执行程序是从系统环境变量去找动态库,可以单独使用
patchelf
命令修改查找路径;如果前两步执行完成,就可以将整个文件夹复制到其它电脑上使用了;
第三步是将整个文件夹制作为一个单独可以运行的AppImage程序。
1.1 linuxdeployqt使用选项
选项 | 说明 |
---|---|
-always-overwrite | 复制文件,即使目标文件存在。 |
-appimage | 创建一个AppImage(默认包含-bundle-non-qt-lib) |
-bundle-non-qt-libs | 打包非Qt库 |
-exclude-libs= ⟨ \langle ⟨ list ⟩ \rangle ⟩ | 应排除的库列表,以逗号分隔。 |
-ignore-glob= | 在搜索库时忽略相对于appdir的glob模式。 |
-executable= | 让给定的可执行文件也使用部署的库 |
-executable-dir= | 让文件夹中的所有可执行文件(递归)也使用部署的库 |
-extra-plugins= | 需要部署的额外插件列表,以逗号分隔。 |
-no-copy-copyright-files | 不部署版权文件。 |
-no-plugins | 跳过插件部署。 |
-no-strip | 不要在二进制文件上运行‘strip’。 |
-no-translations | 跳过翻译的部署。 |
-qmake= | 要使用的qmake可执行文件。 |
-qmldir= | 扫描指定路径中的QML导入。 |
-qmlimport= | 添加给定的路径到QML模块搜索位置。 |
-show-exclude-libs | 打印排除库列表。 |
-verbose=<0-3> | 0 =无输出,1 =错误/警告(默认),2 =正常,3 =调试。 |
-updateinformation= | 嵌入更新信息string;如果安装了zsyncmake,生成zsync文件 |
-version | 打印版本语句并退出。 |
示例:
linuxdeployqt 可执行程序 -appimage
- 注意:可执行程序所在的根文件夹不应该时bin,否则打包的文件会跑到文件夹外。
1.2 patchelf修改动态库搜索路径
如果打包第二步执行失败,则可以手动使用patchelf修改动态库搜索路径。
-
patchelf基本用法:
$ORIGIN
是一个特殊的占位符,它表示当前可执行文件所在的目录
RPATH
是一个嵌入到 ELF 文件中的路径列表,用于告诉动态链接器在运行时去哪里查找共享库。
patchelf --set-rpath '$ORIGIN/lib/' ./RadarServer # 设置程序动态库链接路径
patchelf --print-rpath ./RadarServer # 打印链接路径
1.3 验证
打包完成后需要验证依赖库是否打包完整,可执行程序是否能从当前路径下找到动态库。
- 使用下列命令临时清除动态库环境变量:
export LD_LIBRARY_PATH=""
- 然后再使用ldd命令查看链接动态库是否指向相对路径
ldd ./可执行程序
- 再运行可执行程序看是否能成功运行。
1.4 修改linuxdeployqt源码
注意: 如果离线想通过linuxdeployqt直接生成appimage包,就需要修改源码,否则可用跳过。
- 由于linuxdeployqt调用appimagetool命令没有指定运行时,所以名称使用-appimage打包时都会从github下载runtime,离线环境或者网络差的环境无法使用;
- 需要离线使用linuxdeployqt指定运行时就需要修改linuxdeployqt源码。
- 下载安装runtime,放到/usr/local/bin路径下;
- 打开linuxdeployqt源码,找到shared.cpp文件,搜索
appimagetool
; - 在下图中位置添加指定运行时runtime的路径;
- 然后编译生成linuxdeployqt就可以使用了。
5、使用appimagetool打包生成AppImage程序
AppImage是一种将应用程序及其所有依赖项打包成一个单一可执行文件的格式。这种格式使得分发和运行应用程序变得非常简单,因为用户无需担心安装过程中可能出现的各种问题,如权限不足、缺少依赖库等。以下是关于AppImage程序的一些详细说明:
特点
- 独立性:AppImage包含应用程序的所有依赖项,因此可以在任何支持的Linux发行版上运行,而不需要额外的安装步骤。
- 便携性:AppImage是一个单一的可执行文件,可以方便地复制、移动和分享。
- 安全性:由于AppImage是自包含的,它不会对系统进行任何更改,因此减少了潜在的安全风险。
- 更新简便:用户可以简单地下载新版本的AppImage并替换旧版本,而无需卸载或重新安装。
工作原理
- 打包:开发者使用工具(如
appimagetool
)将应用程序及其所有依赖项打包成一个AppImage文件。- 运行:用户下载AppImage文件后,只需赋予其执行权限(例如通过命令
chmod +x your-app.AppImage
),然后直接运行即可。- 集成桌面环境:AppImage通常会自动集成到用户的桌面环境中,使其在应用菜单中可见。
https://doc.appimage.cn/docs/home/
https://appimage.org/
https://specifications.freedesktop.org/menu-spec/latest/category-registry.html
1.1 安装appimagetool
- 下载runtime可执行程序;runtime-x86_64
- 下载appimagetool可执行程序appimagetool-x86_64.AppImage;
- https://appimage.github.io/appimagetool/
- 使用下面命令安装
sudo chmod 777 runtime-x86_64 appimagetool-x86_64.AppImage # 设置权限
sudo cp runtime /usr/local/bin/runtime
sudo cp appimagetool-x86_64.AppImage /usr/local/bin/appimagetool
1.2 appimagetool选项
appimagetool [选项… ] 可执行程序文件夹 [生成文件名]
[]中是可选
例如:
appimagetool ./untitled4.App --runtime-file /usr/local/bin/runtime-x86_64
将untitled4.App文件夹打包
指定运行时文件路径
--runtime-file /usr/local/bin/runtime-x86_64
。
选项 | 说明 |
---|---|
-h | 帮助 |
-l, --list | 列出SOURCE AppImage中的文件 |
-u, --updateinformation | 嵌入更新信息字符串;如果安装了zsyncmake,生成zsync文件 |
-g, --guess | 基于常用CI系统(GitHub actions, GitLab CI)设置的环境变量猜测更新信息 |
–version | 显示版本号 |
-v, --verbose | 输出详细信息 |
-s, --sign | 用gpg[2]签名 |
–comp | 压缩 |
-n, --no-appstream | 不检查AppStream元数据 |
–exclude-file | 除了.appimageignore之外,还使用指定文件作为mksquash的排除文件。 |
–runtime-file | 指定runtime文件路径 |
–sign-key | 用于gpg[2]签名的密钥ID |
–sign-args | 使用gpg[2]签名时使用的额外参数 |
1.3 打包AppImage工程
创建AppImage
文件夹结构规范
- 不按照文件夹规范也可以,最简单的是创建一个文件夹,文件夹中包含可执行程序、可执行程序.desktop、可执行程序.png三个文件;
- 然后使用linuxdeployqt打包依赖库,如果没有desktop和图标,则在使用linuxdeployqt打包时会生成默认的文件,但是需要修改文件内容;
- 使用appimagetool打包成appimage程序;
desktop规范
.desktop基本文件格式
可用的键值对
[Desktop Entry]
Name=应用程序的具体名称
Exec=可执行程序路径
Icon=图片名称(不包含后缀)
Type=Application # 类型,Application
(类型1);Link
(类型2)Directory
(3型)
Categories=Utilities # 注册类别,必须项
注册类别主要分类
主要类别 | 描述 | Notes |
---|---|---|
AudioVideo | 用于呈现、创建或处理多媒体(音频/视频)的应用程序 | |
Audio | 音频应用程序 | Desktop entry must include AudioVideo as well |
Video | 视频应用 | Desktop entry must include AudioVideo as well |
Development | 开发应用程序 | |
Education | 教学软件 | |
Game | 游戏 | |
Graphics | 用于查看、创建或处理图形的应用程序 | |
Network | 网络应用程序,如web浏览器 | |
Office | 办公室类型的应用程序 | |
Science | 科学软件 | |
Settings | 设置应用程序 | 条目可以出现在单独的菜单中,也可以作为“控制中心”的一部分。 |
System | 系统应用程序,“系统工具”,例如日志查看器或网络监视器 | |
Utility | 小型公用事业应用,“辅助程序” |
示例:
6、错误记录
- 执行linuxdeployqt时报错,需要安装
sudo apt install libfuse2
- https://github.com/AppImage/AppImageKit/wiki/FUSE
dlopen(): error loading libfuse.so.2AppImages require FUSE to run.
You might still be able to extract the contents of this AppImage
if you run it with the --appimage-extract option.
See https://github.com/AppImage/AppImageKit/wiki/FUSE
for more information
- 系统版本过新,需要自己编译linuxdeployqt;
linuxdeployqt (commit b00a83d), build 70 built on 2024-09-08 11:56:56 UTC
ERROR: The host system is too new.
Please run on a system with a glibc version no newer than what comes with the oldest
currently supported mainstream distribution (Ubuntu Focal Fossa), which is glibc 2.31.
This is so that the resulting bundle will work on most still-supported Linux distributions.
For more information, please see
https://github.com/probonopd/linuxdeployqt/issues/340
- linuxdeployqt找不到Qt动态库的环境变量
- 在
.bashrc
中添加export LD_LIBRARY_PATH=/opt/Qt5.14.2/5.14.2/gcc_64/lib:$LD_LIBRARY_PATH
- 在
./linuxdeployqt: error while loading shared libraries: libQt5Core.so.5: cannot open shared object file: No such file or directory
- linuxdeployqt从环境变量中找不到qt的qmake
- 在
.bashrc
中添加export PATH=/opt/Qt5.14.2/5.14.2/gcc_64/bin:$PATH
- 在
ERROR: Desktop file missing, creating a default one (you will probably want to edit it)
ERROR: Icon file missing, creating a default one (you will probably want to edit it)
qmakePath 3= ""
ERROR: qmake not found on the $PATH
- 需要安装
sudo apt install patchelf
relativeBinPath: "untitled"
Keeping existing AppRun
qmakePath 3= ""
ERROR: Could not start patchelf.
ERROR: Make sure it is installed on your $PATH.
ERROR: Error reading rpath with patchelf "libQt5Widgets.so" : ""
ERROR: Error reading rpath with patchelf "libQt5Widgets.so" : ""
- linuxdeployqt找不到
appimagetool
,打包的依赖库已经可以使用了,如果需要打包成appimage程序,就可以下载安装appimagetool和runtime;
relativeBinPath: "untitled"
Keeping existing AppRun
qmakePath 3= ""
sh: 1: appimagetool: not found
- linuxdeployqt默认生成的
default.desktop
文件内缺少必须项Categories
;
WARNING: "/home/mhf/Code/test/qt.conf" already exists, will not overwrite.
fusermount3 version: 3.10.5
appimagetool, continuous build (git version feac857), build 185 built on 2024-11-24 19:31:44 UTC
WARNING: zsyncmake command is missing, please install it if you want to use binary delta updates
Desktop file: /home/mhf/Code/test/default.desktop
Categories entry not found in desktop file
.desktop file is missing a Categories= key
default.desktop
中Categories
设置的值错误,必须是给出的固定值;
/home/mhf/Code/test/default.desktop: error: value "Utilities" for key "Categories" in group "Desktop Entry" contains an unregistered value "Utilities"; values extending the format should start with "X-"
- linuxdeployqt中调用appimagetool需要依赖于runtime,每次都需要从github联网下载;解决办法:
- 下载runtime放到/usr/local/bin路径下,使用appimagetool去打包;
- 修改linuxdeployqt,增加指向runtime的路径。
Using app name extracted from desktop file: Application
/home/mhf/Code/test should be packaged as Application-x86_64.AppImage
Deleting pre-existing .DirIcon
Creating .DirIcon symlink based on information from desktop file
Generating squashfs...
Downloading runtime file from https://github.com/AppImage/type2-runtime/releases/download/continuous/runtime-x86_64
libcurl's default CA certificate bundle file /etc/ssl/certs/ca-certificates.crt was found on this system
libcurl's default CA certificate bundle directory /etc/ssl/certs was found on this system
* Host github.com:443 was resolved.
* IPv6: (none)
* IPv4: 20.205.243.166
* Trying 20.205.243.166:443...
* Connected to github.com (20.205.243.166) port 443
* ALPN: curl offers h2,http/1.1
* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: /etc/ssl/certs
* SSL connection using TLSv1.3 / TLS_AES_128_GCM_SHA256 / X25519 / id-ecPublicKey
* ALPN: server accepted h2
* Server certificate:
* subject: CN=github.com
* start date: Mar 7 00:00:00 2024 GMT
* expire date: Mar 7 23:59:59 2025 GMT
* subjectAltName: host "github.com" matched cert's "github.com"
* issuer: C=GB; ST=Greater Manchester; L=Salford; O=Sectigo Limited; CN=Sectigo ECC Domain Validation Secure Server CA
* SSL certificate verify ok.
* Certificate level 0: Public key type EC/prime256v1 (256/128 Bits/secBits), signed using ecdsa-with-SHA256
* Certificate level 1: Public key type EC/prime256v1 (256/128 Bits/secBits), signed using ecdsa-with-SHA384
* Certificate level 2: Public key type EC/secp384r1 (384/192 Bits/secBits), signed using ecdsa-with-SHA384
* using HTTP/2
* [HTTP/2] [1] OPENED stream for https://github.com/AppImage/type2-runtime/releases/download/continuous/runtime-x86_64
* [HTTP/2] [1] [:method: GET]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: github.com]
* [HTTP/2] [1] [:path: /AppImage/type2-runtime/releases/download/continuous/runtime-x86_64]
* [HTTP/2] [1] [accept: */*]
> GET /AppImage/type2-runtime/releases/download/continuous/runtime-x86_64 HTTP/2
Host: github.com
Accept: */*
- 需要安装
sudo apt install zsync
WARNING: "/home/mhf/Code/RadarServer.AppDir/qt.conf" already exists, will not overwrite.
fusermount3 version: 3.10.5
appimagetool, continuous build (git version feac857), build 185 built on 2024-11-24 19:31:44 UTC
WARNING: zsyncmake command is missing, please install it if you want to use binary delta updates
fatal: 不是 git 仓库(或者任何父目录):.git
Failed to run 'git rev-parse --short HEAD: Child process exited with code 128 (code 128)
Desktop file: /home/mhf/Code/RadarServer.AppDir/default.desktop
/home/mhf/Code/RadarServer.AppDir/default.desktop: error: value "Network" for boolean key "Terminal" in group "Desktop Entry" contains invalid characters, boolean values must be "false" or "true"
ERROR: Desktop file contains errors. Please fix them. Please seehttps://standards.freedesktop.org/desktop-entry-spec/1.0/n for more information.
7、参考
1.1 Qt
- 从Git构建Qt 5 - Qt Wiki
- 从Git构建Qt 6 - Qt Wiki
- Qt Creator安装包
1.2 linuxdeployqt
-
patchelf
-
libfuse2
-
linuxdeployqt
-
linuxdeploy
-
Linuxdeploy用户指南
1.3 appimage
- runtime下载
- appimagetool下载
- AppImage
- appimage英文文档
- appimage中文文档
- AppImage-CN
- appimagetool下载地址
- appimagetool源码及下载地址
- desktop规范
- desktop可用键值对
8、视频
linux下QT程序打包
linux下使用linuxdeployqt工具打包Qt程序
相关文章:
linux下Qt程序部署教程
文章目录 [toc]1、概述2、静态编译安装Qt1.1 安装依赖1.2 静态编译1.3 报错1.4 添加环境变量1.5 下载安装QtCreator 3、配置linuxdeployqt环境1.1 在线安装依赖1.2 使用linuxdeployqt提供的程序1.3 编译安装linuxdeployqt 4、使用linuxdeployqt打包依赖1.1 linuxdeployqt使用选…...
Python3:pytest+request+yaml+allure接口自动化测试
pytest+request+yaml+allure接口自动化测试 一、Pytest的parametrize结合yaml实现数据驱动 1、读取yaml文件数据 ids:- [请求方式,请求地址,请求头,请求参数,预期结果]#测试用例测试数据 testcases:test_login:- ["POST","http://10.1.1.xx:8081/xx/xx"…...
【Docker】针对开发环境、测试环境、生产环境如何编排?
目录 一、引言 二、Docker Compose 文件基础 三、针对不同环境的 Docker 编排 开发环境 测试环境 生产环境 四、配置文件全局变量的编写 五、总结 一、引言 在软件开发和部署的过程中,不同的环境有着不同的需求和配置。Docker 作为一种强大的容器化技术&…...
数据采集卡的各参数介绍
数据采集卡(DAQ 卡)是用于测量物理信号(如电压、电流、温度等)并将其转化为数字信号的设备。 1. 通道数(Channels) 含义:数据采集卡可以同时采集多少路信号。比喻:通道数就像一个人…...
MySQL备份恢复
华子目录 MySQL日志管理为什么需要日志日志作用日志文件查看方法错误日志通用查询日志慢查询日志示例 撤销日志重做日志二进制日志---重要中继日志 MySQL备份备份类型逻辑备份优缺点备份内容备份工具导入sql文件 MySQL日志管理 为什么需要日志 用于排错用来做数据分析了解程序…...
flask内存马的真谛!!!
flask内存马 1.概念 常用的Python框架有Django、Flask, 这两者都可能存在SSTI漏洞. Python 内存马利用Flask框架中SSTI注入来实现, Flask框架中在web应用模板渲染的过程中用到render_template_string进行渲染, 但未对用户传输的代码进行过滤导致用户可以通过注入恶意代码来实…...
【机器学习02--模型评估】
机器学习 --- 模型评估 你需要得到更好的模型,怎么判断模型更好呢?你需要先得到训练集和测试集,怎么划分它们呢?训练完模型之后,在验证集上测试的时候,用什么指标衡量好坏呢?云里雾里࿰…...
【人工智能】深入解析Python中的聚类算法:从K-Means到DBSCAN
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 聚类是一种无监督学习的核心技术,用于将数据点分组到不同的簇中,使得同一簇内的点相似度最大化,不同簇间的点差异性最大化。K-Means和DBSCAN是两种最常见的聚类算法,分别适用于密度驱动和形状复杂的数据分组需…...
【STM32 Modbus编程】-作为主设备读取线圈和输入
作为主设备读取线圈和输入 文章目录 作为主设备读取线圈和输入1、硬件准备与连接1.1 RS452模块介绍1.2 硬件配置与接线1.3 软件准备2、读取线圈2.1 主设备发送请求2.2 从设备响应请求2.3 主机接收数据3、读取输入4、结果本文将在前面文章的基础上,实现主设备通过ModBus协议对从…...
数据结构(栈Stack)
1.前言: 在计算机科学中,栈(Stack)是一种基础而存在的数据结构,它的核心特性是后进先出(LIFO,Last In, First Out)。想象一下,在现实生活中我们如何处理一堆托盘——我们…...
Maven 中scope 的provided、compile、runtime、test、system 含义
在 Maven 中,<scope> 定义了依赖的可见性和生命周期。不同的 scope 值指示 Maven 在编译、测试和运行时如何处理这些依赖。以下是 Maven 中的几种常用依赖范围及其详细说明: 1. <scope>provided</scope> 含义:provided 范…...
Nginx 负载均衡和反向代理
Nginx 是一个高性能的 HTTP 服务器和反向代理服务器,广泛应用于负载均衡中。它的负载均衡功能支持多种策略,可以有效分配流量到后端服务器,提升系统的可靠性和可用性。 负载均衡 首先,Nginx 负载均衡配置是通过在 Nginx 配置文件…...
【网络安全】数据集合集!
本文将为您介绍经典、热门的数据集,希望对您在选择适合的数据集时有所帮助。 1 SecGPT 更新时间:2024-05-08 访问地址: GitHub 描述: SecGPT的愿景是将人工智能技术引入网络安全领域,以提高网络防御的效率和效果。其使命是推动…...
大数据(一)MaxCompute
一、引言 作者后面会使用MaxCompute,所以在进行学习研究,总会有一些疑问产生,这里讲讲作者的疑问和思路 二、介绍 MaxCompute(原名 ODPS - Open Data Processing Service)是阿里云提供的大数据处理平台,专…...
数据科学与大数据之间的区别
什么是数据科学? 数据科学是一个跨学科领域,它将统计学和计算方法相结合,旨在从数据中提取见解和知识。它涉及收集、处理、分析以及解读数据,以揭示可用于为决策过程提供依据并推动创新的模式、趋势和关系。 数据科学涵盖了广泛…...
IP 地理位置定位技术原理概述
本文深入探讨 IP 地理位置定位技术的原理。介绍了 IP 地址的基本概念及其在网络中的作用,随后阐述了基于数据库查询、基于网络拓扑分析以及基于机器学习算法的三种主要 IP 地理位置定位技术原理中的基于IP数据库查询。 IP 地址基础 IP 地址是互联网协议࿰…...
多进程multiprocessing通信multiprocessing.Queue
multiprocessing.Queue 通常只能在主模块(即 if __name__ "__main__": 块)中创建和使用。这是因为 multiprocessing 模块在 Windows 系统上需要通过 if __name__ "__main__": 块来避免递归导入问题。 from multiprocessing import…...
工业—使用Flink处理Kafka中的数据_ChangeRecord2
使用 Flink 消费 Kafka 中 ChangeRecord 主题的数据,每隔 1 分钟输出最近 3 分钟的预警次数最多的 设备,将结果存入Redis 中, key 值为...
微信小程序4-内容溢出滚动条
感谢阅读,初学小白,有错指正。 一、功能描述 在前一篇文章的隐藏框页面的功能里(《微信小程序3-显标记信息和弹框》),我想添加一个内容溢出的时候,可通过滑动滚动条,实现查看溢出部分的内容&a…...
python源码实例游戏开发小程序办公自动化网络爬虫项目开发源码(250+个项目、26.6GB)
文章目录 源代码下载地址项目介绍预览 项目备注源代码下载地址 源代码下载地址 点击这里下载源码 项目介绍 python源码实例游戏开发小程序办公自动化网络爬虫项目开发源码(250个项目、26.6GB) 预览 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情…...
ProjectSend 身份认证绕过漏洞复现(CVE-2024-11680)
0x01 产品描述: ProjectSend 是一个开源文件共享网络应用程序,旨在促进服务器管理员和客户端之间的安全、私密文件传输。它是一款相当流行的应用程序,被更喜欢自托管解决方案而不是 Google Drive 和 Dropbox 等第三方服务的组织使用。0x02 漏洞描述: ProjectSend r1720 之前…...
算法训练-搜索
搜索 leetcode102. 二叉树的层序遍历 法一:广度优先遍历 leetcode103. 二叉树的锯齿形层序遍历 法一:双端队列 法二:倒序 法三:奇偶逻辑分离 leetcode236. 二叉树的最近公共祖先 法一:递归 leetcode230. 二叉…...
【C++】map和set
个人主页 : zxctscl 如有转载请先通知 文章目录 1. 关联式容器2. 键值对3. set3.1 set的模板参数列表3.2 set的构造3.3 set的迭代器3.4 set的容量3.5 set修改操作3.6 multiset 4. map4.1 map的模板参数说明4.2 map的构造4.3 map的迭代器4.4 map的容量与元素访问4.5 …...
MongoDB安装|注意事项
《疯狂Spring Boot讲义》是2021年电子工业出版社出版的图书,作者是李刚 《疯狂Spring Boot终极讲义》不是一本介绍类似于PathVariable、MatrixVariable、RequestBody、ResponseBody这些基础注解的图书,它是真正讲解Spring Boot的图书。Spring Boot的核心…...
使用playwright自动化测试时,npx playwright test --ui打开图形化界面时报错
使用playwright自动化测试时,npx playwright test --ui打开图形化界面时报错 1、错误描述:2、解决办法3、注意符号的转义 1、错误描述: 在运行playwright的自动化测试项目时,使用npm run test无头模式运行正常,但使用…...
Linux ufw 命令详解
简介 UFW(Uncomplicated Firewall) 简单防火墙是一款基于 iptables 构建的、用于管理防火墙规则的用户友好型工具。它简化了在 Linux 系统上配置防火墙的过程。 安装 在 Ubuntu/Debian 上安装 sudo apt update sudo apt install ufw在 CentOS/Red Hat 上安装 sudo yum ins…...
3248. 矩阵中的蛇
3248. 矩阵中的蛇 题目链接:3248. 矩阵中的蛇 代码如下: class Solution { public:int finalPositionOfSnake(int n, vector<string>& commands){int i 0, j 0;for (string& command : commands){if (command "LEFT") { j…...
图片的懒加载
目录 懒加载的来源 事件监听 IntersectionObserver 懒加载的来源 图片的来加载其实就是延迟加载,我们知道浏览器的可视范围是有限的,现在网页的内容越来越丰富,一般网页的内容都是需要滚动才能完成浏览 如果网页有很多图片,然…...
网络脚本生成器
网络官网地址 网络配置生成工具 终端-接入-汇聚-核心-防火墙-互联网路由器 一 开局配置 华为设备配置命令 system-viewsysname SW-JR-Switchvlan 10 vlan 20 vlan 30 vlan 40 quitinterface Vlan-interface 40 ip address 192.168.40.1 255.255.255.0 quitip route-static 1…...
Kibana server is not ready yet
遇到“Kibana server is not ready yet”错误通常表示Kibana无法连接到Elasticsearch。以下是一些常见原因及其解决方案: 1.常见原因 1.1.Elasticsearch未运行: 确保Elasticsearch服务已启动并正常运行。您可以通过访问 http://localhost:9200 来检查…...
Git 高频命令及其功能、作用与使用场景
在软件开发的世界里,Git 已经成为了版本控制的代名词。无论你是开发小型项目还是参与大型团队协作,Git 都是你不可或缺的得力助手。今天我们来聊聊 Git 中的一些高频命令,了解它们的功能、作用以及常见的使用场景,帮助你在日常开发…...
将word里自带公式编辑器编辑的公式转换成用mathtype编辑的格式
文章目录 将word里自带公式编辑器编辑的公式转换成用mathtype编辑的格式MathType安装问题MathType30天试用延期MathPage.wll文件找不到问题 将word里自带公式编辑器编辑的公式转换成用mathtype编辑的格式 word自带公式编辑器编辑的公式格式: MathType编辑的格式&a…...
【HarmonyOS】Component组件引入报错 does not meet UI component syntax.
【HarmonyOS】Component组件引入报错 一、问题背景 有时会碰到引入组件时,无法import引入组件,导致引入的组件报错。 或者提示does not meet UI component syntax. (不符合UI组件语法。) 如下图所示,在引入组件时&a…...
力扣-图论-1【算法学习day.51】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…...
使用lumerical脚本语言创建定向耦合器并进行数据分析(纯代码实现)
本文使用lumerical脚本语言创建定向耦合器波导、计算定向耦合器的偶数和奇数模式、分析定向耦合器的波长依赖性、分析定向耦合器的间隙依赖性(代码均有注释详解)。 一、绘制定向耦合器波导 1.1 代码实现 # 这段代码主要实现了绘制定向耦合器波导几何结构的功能。通过定义各种…...
Java面试要点50 - List的线程安全实现:CopyOnWriteArrayList
文章目录 一、引入二、实现原理解析2.1 写时复制机制2.2 读写分离策略 三、性能测试分析四、应用场景分析4.1 事件监听器管理4.2 缓存实现 五、最佳实践建议5.1 性能优化技巧5.2 常见陷阱规避 总结 一、引入 在并发编程中,线程安全的集合类扮演着重要角色。CopyOnWriteArrayLi…...
python脚本实现csv中百度经纬度转84经纬度
数据准备 csv文件,带百度经纬度字段:bd09_x,bd09_y 目的 将百度经纬度转换为84经纬度,并在csv文件中添加两个字段:84_x,84_y python脚本 from ChangeCoordinate import ChangeCoordimport pandas as pd import numpy as npcoord = ChangeCoord()def bd09_to_wgs84...
Vue2和Vue3的区别
响应式系统 Vue 2 技术基础:使用 Object.defineProperty 实现响应式。局限性: 无法监听新增属性:如果在创建实例后添加新属性,这些属性不会自动成为响应式的。数组变更检测问题:直接通过索引设置值或长度不会触发更新…...
JavaEE-经典多线程样例
文章目录 单例模式设计模式初步引入为何存在单例模式饿汉式单例模式饿汉式缺陷以及是否线程安全懒汉式单例模式基础懒汉式缺陷以及是否线程安全懒汉式单例模式的改进完整代码(变量volatile) 阻塞队列生产者消费者模型生产者消费者模型的案例以及优点请求与响应案例解耦合削峰填…...
Android显示系统(04)- OpenGL ES - Shader绘制三角形
一、前言: OpenGL 1.0采用固定管线,OpenGL 2.0以上版本重要的改变就是采用了可编程管线,Shader 编程是指使用着色器(Shader)编写代码来控制图形渲染管线中特定阶段的处理过程。在图形渲染中,着色器是在 GP…...
PMP–一、二、三模、冲刺–分类–10.沟通管理
文章目录 技巧十、沟通管理 一模10.沟通管理--1.规划沟通管理--文化意识--军事背景和非军事背景人员有文化差异5、 [单选] 项目团队由前军事和非军事小组成员组成。没有军事背景的团队成员认为前军事团队成员在他们的项目方法中过于结构化和僵化。前军事成员认为其他团队成员更…...
flutter windows 使用c++、dll等实践记录
在flutter的windows平台引入dll文件 https://juejin.cn/post/7223676609794015287 google官方说法(感觉不太实用) https://groups.google.com/a/dartlang.org/g/misc/c/fyh2W38AEVo Using a C DLL in Flutter Windows desktop app(未尝试&…...
JUnit介绍:单元测试
1、什么是单元测试 单元测试是针对最小的功能单元编写测试代码(Java 程序最小的功能单元是方法)单元测试就是针对单个Java方法的测试。 2、为什么要使用单元测试 确保单个方法运行正常; 如果修改了代码,只需要确保其对应的单元…...
电脑插入耳机和音响,只显示一个播放设备
1. 控制面板-硬件和声音-Realtek高清音频-扬声器-设备高级设置-播放设备里选择使用前部和后部输出设备同时播放两种不同的音频流 在声音设置中就可以看到耳机播放选项...
【每日刷题】Day162
【每日刷题】Day162 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 3302. 字典序最小的合法序列 - 力扣(LeetCode) 2. 44. 通配符匹配 - 力扣&…...
使用 EasyExcel 实现高效的 Excel 读写操作
在日常开发中,Excel 文件的读写操作是一个常见的需求。EasyExcel 是阿里巴巴开源的一个高性能、易用的 Excel 读写库,可以大幅提高处理 Excel 文件的效率。它通过事件驱动模型优化了大数据量 Excel 的读写性能,非常适合处理大文件或高并发场景…...
千益畅行,旅游卡有些什么优势?
千益畅行共享旅游卡是一种创新的旅游服务模式,旨在通过整合各类旅游资源,为用户提供一站式的旅游解决方案。这张旅游卡支持2至6人同行,涵盖了接机、酒店、用餐、大巴、导游、景区门票等服务,用户只需自行承担往返交通费用即可享受…...
Hive分区裁剪(Partition Pruning)详解
Hive分区裁剪是一种优化技术,旨在查询时只读取与条件匹配的分区,从而减少不必要的数据扫描。这种机制依赖于分区表的设计和查询优化器的工作,特别是在处理大规模数据时,分区裁剪可以显著提高查询性能。 1. 什么是分区裁剪…...
云原生数据库 PolarDB
PolarDB 是阿里云推出的一款云原生数据库,旨在为企业提供高性能、高可靠性的数据库解决方案。它基于云计算环境设计,特别适用于云上的大规模数据处理和存储需求。PolarDB 是一种兼具关系型数据库(RDS)和分布式数据库特性的新型数据…...
数据库原理-期末基础知识
1、数据库管理系统有哪些功能? 数据定义功能、数据操作功能、数据库的运行管理、数据库的建立与维护。 2、数据库设计分哪几个阶段? 需求分析->概念设计->逻辑设计->物理设计->数据库实施->数据的运营与维护 3、简述三级封锁协议的内…...