起因:项目中用qt quick程序写的上位机程序,在公司多台电脑能运行,客户电脑要更新显卡才能运行,可后来发现是少了opengl32.dll。于是乎,想运用静态编译来避免此问题,开干。
准备工作:工作机本身安装的qt5.7.0 mingw,由于通过vs2010编译了一个动态库,上位机调用的时候也得用vs的编译器,下载了msvc2013,msvc2010不得行,这个问题还鼓捣了一阵。但安装的时候都没有安装源码,得,下源码去。下载源码的时候看好像得装perl和python,间歇就把perl装好了,python以前都有装。
直接去网上下载,不多说,一样选择qt5.7.0版本,保持一致
msvc
修改源码中\qtbase\mkspecs\common\msvc-desktop.conf文件
QMAKE_CFLAGS_RELEASE = -O2 -MD
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi
QMAKE_CFLAGS_DEBUG = -Zi -MDd
改为
QMAKE_CFLAGS_RELEASE = -O2 -MT
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi
QMAKE_CFLAGS_DEBUG = -Zi -MTd
mingw
修改源码中\qtbase\mkspecs\win32-g++\qmake.conf文件
QMAKE_LFLAGS =
QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads
QMAKE_LFLAGS_EXCEPTIONS_OFF =
QMAKE_LFLAGS_RELEASE = -Wl,-s
QMAKE_LFLAGS_DEBUG =
QMAKE_LFLAGS_CONSOLE = -Wl,-subsystem,console
QMAKE_LFLAGS_WINDOWS = -Wl,-subsystem,windows
QMAKE_LFLAGS_DLL = -shared
改为:
QMAKE_LFLAGS = -static
QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads
QMAKE_LFLAGS_EXCEPTIONS_OFF =
QMAKE_LFLAGS_RELEASE = -Wl,-s
QMAKE_LFLAGS_DEBUG =
QMAKE_LFLAGS_CONSOLE = -Wl,-subsystem,console
QMAKE_LFLAGS_WINDOWS = -Wl,-subsystem,windows
QMAKE_LFLAGS_DLL = -static
msvc
设置python,perl和nmake的环境变量
configure -confirm-license -opensource -platform win32-msvc2013 -debug-and-release -static -prefix "F:\QT_MSVC\5.7\msvc2013_static" -qt-sql-sqlite -qt-sql-odbc -plugin-sql-sqlite -plugin-sql-odbc -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype -no-qml-debug -no-angle -nomake tests -nomake examples
nmake
nmake install
mingw
设置python,perl和nmake的环境变量
configure -confirm-license -opensource -platform win32-g++ -debug-and-release -static -prefix "C:\Qt\Qt5.7.0\5.7\mingw53_32_static" -qt-sql-sqlite -qt-sql-odbc -plugin-sql-sqlite -plugin-sql-odbc -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype -no-qml-debug -no-angle -nomake tests -nomake examples
mingw32-make -j2 / mingw32-make
mingw32-make install
编译很顺利,msvc版本编译的时候,遇到一个问题,网上找到解决方案
qnode_p.h
Comment line 104 and 105:
// template
// using DestructionFunction = void (Caller::*)(NodeType *);
Change line 108 from:
void registerDestructionHelper(NodeType *, DestructionFunction, PropertyType);
to:
void registerDestructionHelper(NodeType *, void (Caller::*)(NodeType *), PropertyType);
line 111 from:
void registerDestructionHelper(NodeType *node, DestructionFunction
to :
void registerDestructionHelper(NodeType *node, void (Caller::*func)(NodeType *), NodeType *&)
line 119 from:
void registerDestructionHelper(NodeType *node, DestructionFunction
to :
void registerDestructionHelper(NodeType *node, void (Caller::*func)(NodeType *), QVector
其他都没啥问题,打开qtcreator增加编译套件,创建项目,编译,运行,bingo
本机上widget和qt quick运行都没问题,但是拷贝到纯净电脑,widget程序也没问题,就是qt quick程序,一打开就崩溃,找了好久,到现在还是没能知道原因,看别人有用qt5.9.0静态发布qml程序能成功,就是把动态库里qml下的.qml文件拷贝到静态库里,并增加到项目里面,我试过,还是没成,放弃了,想到会不会是qt版本原因,可惜没去测试。