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
- 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
七、其他
-
本地缓存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 打包命令
-
兼容本地调试及Appimage的配置路径写法
confdir.h