AppImage打包

AppImage打包:

一、下载工具链

复制代码
linuxdeploy,linuxdeploy-plugin-qt
下载命令
`
wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage
wget https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage

chmod +x linuxdeploy-*.AppImage
`

二、构建AppDir目录

a. 添加.desktop文件及icon文件等,执行 build_AppDir.sh

三、确认目录现在完整如下(非常关键)

复制代码
	myproject/

└── usr/

├── bin/myproject

├── lib/...

├── share/

├── applications/

│ └── myproject.desktop ✅ 必须

└── icons/

└── hicolor/

└── 256x256/apps/

└── myproject.png ✅ 必须

四、构建AppImage

执行构建命令前先临时设置LD_LIBRARY_PATH添加依赖库路径
linuxdeploy-x86_64.AppImage \ --appdir myproject \ --executable myproject/usr/bin/myproject \ --plugin qt \ --output appimage

五、打包完成后的必做验证步骤(2 条命令)

1️⃣ 验证 AppImage 能启动:

./myproject-x86_64.AppImage

2️⃣ 验证依赖是否全部来自包内:

./myproject-x86_64.AppImage --appimage-extract

ldd squashfs-root/usr/bin/myproject | grep usr/lib

六、AppImage读取配置文件相关修改

打包后路径对应

./xxx.conf //当前目录此时对应的时AppImage包所在路径

applicationDirPath() //此时对应的路径为AppImage包目录下的/usr/bin

  1. APPImage包只读的配置文件路径可直接一起打包,修改查找路径:

#ifdef BUILD_APPIMAGE

strAppPath = QCoreApplication::applicationDirPath()

  • "/.../share/myproject/dist/combinnav";

#else

strAppPath = QDir::currentPath()+"/dist/combinnav";

#endif

复制代码
1. 需要安装后修改的,
a. 默认配置仍然放在 AppImage 内(只读模板)
b. 启动时自动复制到"用户可写目录"
你必须保证 main() 启动第一行就执行这段代码:

void initConfDir()

{

QString userConfDir =

QStandardPaths::writableLocation(

QStandardPaths::AppConfigLocation) + "/conf";

QString defaultConfDir =

QCoreApplication::applicationDirPath()

  • "/.../share/myapp/conf";

QDir userDir(userConfDir);

if (!userDir.exists())

userDir.mkpath(".");

QDir src(defaultConfDir);

for (const QFileInfo &fi : src.entryInfoList(QDir::Files)) {

QString dst = userConfDir + "/" + fi.fileName();

if (!QFile::exists(dst)) {

QFile::copy(fi.absoluteFilePath(), dst);

}

}

}

在 main() 中:

复制代码
int main(int argc, char *argv[])

{

QApplication app(argc, argv);

initConfDir(); // ✅ 必须在任何读配置之前

MainWindow w;

w.show();

return app.exec();

}

c. 之后 所有写配置操作只允许使用用户目录

复制代码
//写入示例

QString confDir =

QStandardPaths::writableLocation(

QStandardPaths::AppConfigLocation) + "/conf";

QSettings def(confDir + "/default.ini", QSettings::IniFormat);

def.setValue("ui/theme", "dark"); // ✅ 这里一定可写

def.sync();

复制代码
或者用户手动修改后直接使用
#ifdef BUILD_APPIMAGE
    QString confDir =
    QStandardPaths::writableLocation(
        QStandardPaths::AppConfigLocation) + "/conf";
    QSettings m_settings(confDir + "/default.ini", QSettings::IniFormat);
    qDebug()<< Q_FUNC_INFO << "Appimage Config Path:" << confDir + "/default.ini";
#else
    QSettings m_settings("./conf/default.ini", QSettings::IniFormat);
    qDebug() << Q_FUNC_INFO << "Config Path:" << "./conf/default.ini";
#endif

七、其他

  1. 本地缓存runtime

    a. 手动下载runtime包

    wget -O runtime-x86_64 https://github.com/AppImage/type2-runtime/releases/download/continuous/runtime-x86_64

    b. 设置环境变量让 appimagetool 使用本地 runtime(关键)

    export APPIMAGE_RUNTIME_FILE=~/appimage/runtime/runtime-x86_64

    c. 重新运行你的 linuxdeploy 打包命令

  2. 兼容本地调试及Appimage的配置路径写法

    confdir.h

相关推荐
qetfw3 天前
Debian SSH 与 SFTP 分离:独立端口、Chroot 隔离与 internal-sftp
debian·ssh
qetfw6 天前
Debian Squid 代理与反向代理:ACL、3128 端口与验证
debian·squid
小祺先生8 天前
mt7921 debian系统 如何安装驱动
运维·网络·debian
qetfw8 天前
Debian 10 部署 Roundcube Webmail:Bind9、Postfix、Dovecot、SMTPS、IMAPS 与 HTTPS
debian·roundcube
黑色的白兔No19 天前
deepin 25安装mysql
数据库·mysql·debian
皓月盈江9 天前
Linux系统使用VSCode搭建GO开发环境
linux·vscode·ubuntu·golang·debian
qetfw11 天前
Debian Postfix + Dovecot + MariaDB 虚拟邮箱连接:SQL 用户、域名与别名配置
linux·debian
qetfw13 天前
Debian Postfix + Dovecot 基础配置:DNS、Maildir、IMAP 与邮件队列验证
linux·服务器·网络·debian
CedarQR13 天前
LubanCat-2 (RK3568) Debian 下让 H3C Magic USB 无线网卡(AIC8800)联网全记录
linux·网络·单片机·嵌入式硬件·debian·3568·h3c
qetfw15 天前
Debian 部署 phpMyAdmin:Apache、PHP 与 MariaDB 管理界面配置
linux·debian·php·apache