Qt 打包发布(自定义Cmd提取依赖)
阵营横跳,有始有终。VS依靠系统平台加成,开发,调试,发布浑然天成;Qt也正是因为没有加成,摆脱了平台束缚,成就跨平台优势。阴阳相补,Qt的开发,调试,发布没有了一条龙服务,以下要说的就是发布,编译好的exe无法直接运行,需要提取依赖库,用得最多的应该就是“windeployqt”这个命令,cd的烦恼谁用谁知道,那就用bat来封装这一系列命令。
一、依赖库提取
程序编译应使用“Release”方式,否则依赖库提取的会很大。这里以Qt 5.9.9为例。
1.1 常规 windeployqt
新建一个空目录,复制编译好的exe进去
打开开始菜单Qt目录下的的“Qt 5.9.9 (MinGW 5.3.0 32-bit)”快捷方式
输入cmd指令 “F:” 切换盘符
输入cmd指令 “cd Qt.Out” 进入需要提取依赖的exe目录
输入cmd指令 “windeployqt Cmd.exe” 执行提取
等待结束
直接运行exe即可打开程序
1.2 编写代码封装执行 bat
原理:使用Qt复制文件,生成bat文件来执行依赖提取。首先,找到Qt的编译环境,需要从这里提取依赖,右键开始菜单Qt目录下的的“Qt 5.9.9 (MinGW 5.3.0 32-bit)”快捷方式,打开属性
目标的内容包含有一个bat文件路径,找到这个文件的目录,右键这个文件用记事本打开
其中的“set PATH…”这一行就是Qt编译环境的设置语句,自定义的bat脚本需要这一句
void MainWindow::on_btnCmd_clicked()
{
QString windeployqt=ui->txtC->text().simplified(); //Qt编译环境,“set PATH.......”,注意字符串‘\’在Qt代码中是‘\\’
//除了Qt编译环境文本,路径类的字符串中尽量使用char‘\\’,不要使用‘/’
QString originFilePath=ui->txtA->text().simplified(); //编译好的exe路径
QString exportPath=ui->txtB->text().simplified(); //导出的依赖库目录
QString name=originFilePath.split('\\')[originFilePath.split('\\').length()-1]; //文件名,提取时使用
QString destFilePath=exportPath+"\\"+name; //导出的依赖库目录主程序路径
QString batPath=QCoreApplication::applicationDirPath()+"/"; //bat批处理运行目录
QString batFilePath=QCoreApplication::applicationDirPath()+"/打包.bat"; //bat批处理文件名称
QDir dir;
if(dir.mkdir(exportPath))//创建文件夹
{
}
if(QFile::copy(originFilePath,destFilePath))//复制到提取目录
{
}
QString bat="@echo off";
bat.append("\r\n"+windeployqt);
bat.append("\r\ncd /d "+exportPath);
bat.append("\r\nwindeployqt "+name);
QFile file(batFilePath);
if(!file.exists()){
}
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)){
}
QByteArray array = bat.toUtf8();
file.write(array, array.length());
file.close();
QProcess* process = new QProcess();
process->setWorkingDirectory(batPath);
QString commed = batFilePath;
process->start(commed);
process->waitForFinished();
QMessageBox::information(this,"提示","完成");
}
二、打包成单个文件
上一步得到的是exe运行的目录,可以使用“Enigma Virtual Box”工具打包成一个exe文件。
其中“文件选项”中要勾选“压缩文件”,点击“打包”完成。
三、依赖提取工具下载
https://download.csdn.net/download/u012619677/88442010
编译环境文本的内容在1.2中有说明。光标放置哪个文本框,拖动文件或目录至窗体会自动填写路径和目录。手动填写路径和目录时,应使用可见字符‘\’,不应使用‘/’。
四、联系作者
gshuaijun@163.com