You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Qt CMake构建中便携部署随应用程序附带的文件?

Qt跨平台部署大文件(非QResource方案)

针对你需要在桌面和Android平台部署大文件,且要求通过applicationDirPath() + 文件名访问的需求,可按以下步骤配置:

一、构建系统配置(分qmake/CMake)

1. qmake项目(.pro文件)

桌面平台(Windows/macOS/Linux)

在.pro文件中添加文件部署规则,确保构建后文件被复制到可执行文件同目录:

# 定义要部署的文件列表
FILES_TO_DEPLOY = bigfile1.dat bigfile2.dat

# 设置部署路径为可执行文件所在目录
files.path = $$DESTDIR
files.files = $$FILES_TO_DEPLOY

# 注册部署规则
INSTALLS += files

执行make install(Linux/macOS)或通过Qt Creator的"部署"步骤,文件会自动复制到可执行文件同级目录。

Android平台

首先在项目根目录创建android_files文件夹,内部再建assets子目录,把两个大文件放入assets中。然后在.pro文件中指定Android资源目录:

ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android_files

构建APK时文件会被打包到APK的assets目录,但此时无法直接通过applicationDirPath()访问,需配合代码完成复制逻辑(见下文)。

2. CMake项目(CMakeLists.txt)

桌面平台

使用install命令将文件安装到可执行文件所在目录:

# 定义要部署的文件
set(FILES_TO_DEPLOY bigfile1.dat bigfile2.dat)

# 安装到可执行文件目录(CMAKE_INSTALL_BINDIR对应可执行文件输出目录)
install(FILES ${FILES_TO_DEPLOY} DESTINATION ${CMAKE_INSTALL_BINDIR})

执行cmake --install .或通过Qt Creator部署,文件会被复制到目标位置。

Android平台

设置Android assets目录,将文件打包进APK:

# 指定assets目录路径
set(ANDROID_ASSETS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android_files/assets)
# 将文件复制到assets目录(若文件不在该目录可添加此步骤)
file(COPY bigfile1.dat bigfile2.dat DESTINATION ${ANDROID_ASSETS_DIR})

同样需要代码层面的复制逻辑来将assets文件迁移到applicationDirPath()对应的目录。

二、代码层面的文件复制逻辑(Android平台必备)

在应用启动时,检查目标路径下的文件是否存在,若不存在则从assets复制到applicationDirPath():

#include <QCoreApplication>
#include <QFile>
#include <QDir>

bool copyAssetToLocal(const QString &assetName, const QString &localPath) {
    QFile assetFile(QString("assets:/%1").arg(assetName));
    QFile localFile(localPath);

    if (!assetFile.open(QIODevice::ReadOnly)) {
        return false;
    }
    if (!localFile.open(QIODevice::WriteOnly)) {
        assetFile.close();
        return false;
    }

    localFile.write(assetFile.readAll());
    assetFile.close();
    localFile.close();
    return true;
}

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    QString appDir = QCoreApplication::applicationDirPath();

    // 遍历要部署的文件,检查并复制
    QStringList files = {"bigfile1.dat", "bigfile2.dat"};
    for (const QString &fileName : files) {
        QString localPath = appDir + "/" + fileName;
        if (!QFile::exists(localPath)) {
            copyAssetToLocal(fileName, localPath);
        }
    }

    // 后续应用逻辑...
    return a.exec();
}

Android平台下applicationDirPath()对应应用的私有目录(/data/data/[包名]/files),该目录有读写权限,适合存放这些大文件。

三、验证与测试

  • 桌面平台:构建部署后,检查可执行文件同目录是否存在目标文件,直接通过applicationDirPath()+文件名访问即可。
  • Android平台:安装APK后,首次启动会自动复制文件到私有目录,后续启动直接读取本地文件,无需重复复制。

内容的提问来源于stack exchange,提问作者Tomáš Zato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 21:36:05