背景说明
-
这里采用engima vitual box 作为打包软件
-
采用qt 静态编译作为编译环境
-
之前采用qt静态编译,编译程序文件大小为30M,修改完成后,编译程序大小为15M
相关测试结论
-
在测试时,发现,engima 打包文件会对其他文件进行压缩,但不会对exe主文件进行压缩 ,那么就要求exe文件需要尽可能的小。
-
通过封包和解包操作对比原始exe,发现engima visualbox 会改变exe 头相关内容,使解包之后的不能工作,个人猜测upx不能工作的原因也在于此。
相关方案设计
-
方案1,采用exe 调用exe方式(有文件路径以及黑边问题,故这种方案舍弃)
-
方案2,exe 调用dll方式,成功实现该方案。
exe调用dll方式
qt 应用程序改为dll
qmake加入编译成dll选项
TEMPLATE = lib
CONFIG += dll
main.cpp 使用如下模板
#include "mainwindow.h"
#include <QApplication>
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) int dll_main(int argc, char *argv[])
{
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
#ifdef __cplusplus
}
#endif
int main(int argc, char *argv[])
{
return dll_main(argc, argv);
}
-
如果注释掉dll选项,则程序可以正常编译为exe,并运行
-
采用extern C 可保证dll导出为 c可识别函数。导出函数名为dll_main
exe调用文件模板
#include <windows.h>
#include <stdio.h>
// g++ xz_entry.c -mwindows -o xz_entry.exe
int main(int argc, char *argv[])
{
HMODULE module = LoadLibrary("TR360XZ_3D_release.dll");
if (module == NULL)
{
printf("加载DLLTest1.dll动态库失败\n");
return 1;
}
typedef int(*MainFunc)(int, char **); // 定义函数指针类型
MainFunc dll_main_func;
dll_main_func = (MainFunc)GetProcAddress(module, "dll_main");
dll_main_func(argc,argv);
if(module)
{
FreeLibrary(module);
}
return 0;
}
-
采用g++ xz_entry.c -mwindows -o xz_entry.exe程序能正常执行
封包可采用enigma 脚本进行封包
-
QMAKE_POST_LINK +=enigmavbconsole.exe .\pack.evb,当文件有改动时会调用enigma 重新生成exe
实际测试情况下相关情况说明
-
upx 文件缩减命令upx.exe -9 -k filename
-
原始dll文件大小为27M,通过upx进行精简后大小为10M,exe大小为50M,最终整个程序打包下来14.4M
-
如果采用原始dll文件直接打包,程序大小为15M,相对于而言,程序有缩减,但缩减不大。