
Windows下Qt静态编译连接和DLL依赖问题解决.doc
20页Windows 下 Qt 静态编译连接和生成程序的mingwm10.dll、 libgcc_s_dw2-1.dll 依赖问题解决本文编写和程序配置调试: 蔚蓝 (winland0704@ ) Qt 库-MinGW 版本(Qt Creator)静态编译和 DLL 依赖解决1、MinGW 版本(1)MinGW 官方版本(gcc-4.5.2)使用 dwarf2 异常处理,默认使用动态 C 运行时库,默认生成的程序依赖:libgcc_s_dw2-1.dll(105K)libstdc++-6.dll(860K)使用参数 -static 可以解除对以上 dll 依赖现在新版 MinGW 生成的程序默认已经不依赖 mingwm10.dll 了2)TDM-GCC 版本(Codelite 和 CodeBlocks 带的, gcc-4.4.1)使用 sjlj 异常处理,默认使用静态 C 运行时库,默认生成的程序独立运行,无 dll 依赖问题3)MinGW Distro - 最新版本(gcc 4.6.0)使用 dwarf2 异常处理,默认使用静态 C 运行时库,无 DLL 依赖问题4)QP-GCC 版本(gcc-4.4.5)使用 dwarf2 异常处理,默认使用静态 C 运行时库,无 DLL 依赖问题。
5)PCX 版本,包括 32bit 和 64bit 版本的 MinGW(最新有 gcc 4.6 测试版)与(4)差不多,无 DLL 依赖问题6)Qt 库自带的 MinGW(gcc-4.4.0)GCC 配置信息:D:\Qt\2011qt>gcc -vUsing built-in specs.Target: mingw32Configured with: ../gcc-4.4.0/configure --enable-languages=c,ada,c++,fortran,java,objc,obj-c++ --disable-sjlj-exceptions --enable-shared --enable-libgcj --enable-libgomp --with-dwarf2 --disable-win32-registry --enable-libstdcxx-debug--enable-version-specific-runtime-libs --prefix=/mingw --with-gmp=/mingw/src/gmp/root--with-mpfr=/mingw/src/mpfr/root --build=mingw32Thread model: win32gcc version 4.4.0 (GCC)Qt 带的这个 MinGW 比较老,gcc-4.4.0 版,使用 dwarf2 异常处理,默认使用动态 C 运行时库。
编写 helloworld 控制台程序,main.cpp#include #include #include using namespace std;int main(int argc, char **argv){printf("Hello World!\n");cout#include int main(int argc, char *argv[]){QApplication app(argc, argv);QLabel *label = new QLabel("Hello Qt !");label->show();return app.exec();}打开 Qt 环境命令行,执行:$ cd /d D:\QtExample\helloqt$ qmake -project$ qmake helloqt.pro生成 Debug 版程序:$ mingw32-make -f Makefile.Debug生成 Release 版程序$ mingw32-make -f Makefile.Release3、官方 Qt 版本(默认动态库)和 Qt Creator 带的 MinGW 版本(默认动态 C 运行库)测试(1)打开开始菜单----》 Qt by Nokia v4.7.2 (MinGW OpenSource)----》Qt 4.7.2 Command Prompt$ cd /d D:\QtExample\helloqt然后按 2 中生成项目,编译连接程序。
生成 helloqt.exe,Debug 版大小: 455 KBRelease 版大小:59 KB不能独立运行,依赖 DLL 顺序:第一:mingwm10.dll (11 KB)第二:libgcc_s_dw2-1.dll (42 KB)第三:QtCore4.dll (2.43 MB),debug 版对应是 QtCored4.dll第四:QtGui4.dll (9.45 MB),debug 版对应是 QtGuid4.dll除了 exe 之外,还得带上 4 个动态链接库2)使用 static 参数重新创建将 helloqt.pro 复制一份,改名为 helloqt-s.pro,用记事本打开 helloqt-s.pro,在最后一行加上一句:QMAKE_LFLAGS += -static然后保存在 Qt 4.7.2 Command Prompt 命令行内执行:$ qmake helloqt-s.pro$ mingw32-make -f Makefile.Debug$ mingw32-make -f Makefile.Release生成新的 helloqt-s.exe,Debug 版大小: 541 KBRelease 版大小:76 KB依赖的 DLL 顺序:第一:mingwm10.dll (11 KB)第二:QtCore4.dll (2.43 MB),debug 版对应是 QtCored4.dll第三:libgcc_s_dw2-1.dll (42 KB)第四:QtGui4.dll (9.45 MB),debug 版对应是 QtGuid4.dll这里奇怪的是,为什么还需要 libgcc_s_dw2-1.dll 呢?命令行测试 helloworld 程序在-static 生效后是不需要 libgcc 库的。
这里的 release 版 helloqt-s.exe 也确实增加了 17KB,说明 exe 本身是带了 libgcc 代码的原因就在这四个依赖库的顺序!可见是 QtGui 的 dll 在依赖 libgcc_s_dw2-1.dll,Qt 库本身还要依赖 libgcc_s_dw2-1.dllQt 官方发布的库是底层用动态 C 运行时库,并且上层也是动态生成的 Qt*.dll,所以即使在生成程序时用了-static 参数,也不能减少 dll 的依赖4、官方 Qt 版本(默认动态库)和 QP-GCC 版本 MinGW(默认静态 C 运行时库)测试我们将 Qt 目录下:\bin\qtvars.bat 复制一份到 D:\QtExample\helloqt 目录下面现在替换 MinGW,用记事本打开 helloqt 目录下的 qtvars.bat,原来的:echo Setting up a MinGW/Qt only environment...echo -- QTDIR set to D:\Qt\2011qtecho -- PATH set to D:\Qt\2011qt\binecho -- Adding D:\Qt\2011\mingw\bin to PATHecho -- Adding %SystemRoot%\System32 to PATHecho -- QMAKESPEC set to win32-g++set QTDIR=D:\Qt\2011qtset PATH=D:\Qt\2011qt\binset PATH=%PATH%;D:\Qt\2011\mingw\binset PATH=%PATH%;%SystemRoot%\System32set QMAKESPEC=win32-g++改写为:echo Setting up a MinGW/Qt only environment...echo -- QTDIR set to D:\Qt\2011qtecho -- PATH set to D:\Qt\2011qt\binecho -- Adding D:\MinGW\bin to PATHecho -- Adding %SystemRoot%\System32 to PATHecho -- QMAKESPEC set to win32-g++set QTDIR=D:\Qt\2011qtset PATH=D:\Qt\2011qt\binset PATH=%PATH%;D:\MinGW\binset PATH=%PATH%;%SystemRoot%\System32set QMAKESPEC=win32-g++cmd /k改好保存。
改后的 D:\MinGW\bin 就是之前安装 QP-GCC 版本的 MinGW\bin 目录然后双击 qtvars.bat,就可以直接打开 Qt 编译环境命令行了这样就完成了 MinGW 替换,我们用新的 QP-GCC 来编译 helloqt 程序1)生成 helloqt.exe$ qmake helloqt.pro$ mingw32-make -f Makefile.Debug$ mingw32-make -f Makefile.Release生成新的 helloqt.exe:Debug 版大小: 384 KBRelease 版大小:62 KB依赖 DLL 的顺序:第一:QtCore4.dll (2.43 MB),debug 版对应是 QtCored4.dll第二:mingwm10.dll (11 KB)第三:libgcc_s_dw2-1.dll (42 KB)第四:QtGui4.dll (9.45 MB),debug 版对应是 QtGuid4.dll注意这四个依赖库的顺序又有变化!这次将 QtGui4.dll 的依赖体现的清清楚楚!Helloqt.exe 使用 QP-MinGW 生成的,自己默认带静态 C 运行时库代码的。
这里完全是 QtGui4.dll 惹的祸!QtGui4.dll 是使用老版本的 gcc-4.4.0 动态链接生成的是QtGui4.dll 需要底层 C 运行时库,就是 mingwm10.dll 和 libgcc_s_dw2-1.dll要想解除 DLL依赖,必须自己动手编译静态 Qt 库2)生成 helloqt-s.exe$ qmake helloqt-s.pro$ mingw32-make -f Makefile.Debug$ mingw32-make -f Makefile.Release生成新的 helloqt-s.exe:Debug 版大小: 384 KBRelease 版大小:62 KB由于 QP-GCC 默认就是使用静态 C 运行时库, (1)中版本与(2)中完全一样依赖关系也一样不赘述了5、静态编译的 Qt 版本(默认静态链接)和 QP-GCC 版本MinGW(默认静态 C 运行时库)测试(1)我们使用 QP-MinGW 来编译新的静态 Qt 库①打开我们在 helloqt 目录下的新 qtvars.bat,这样 Qt 目录和 MinGW 目录、QMAKESPEC 参数就都设置好了。
②在 qt 库安装目录(D:\Qt\2011qt)下面,修改 D:\Qt\2011qt\mkspecs\win32-g++ 目录下面 qmake.conf 文件(先备份) ,改两处:QMAKE_LFLAGS = -enable-stdcall-fixup -Wl,-en。
