好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

Windows下Qt静态编译连接和DLL依赖问题解决.doc

20页
  • 卖家[上传人]:平***
  • 文档编号:15583920
  • 上传时间:2017-11-05
  • 文档格式:DOC
  • 文档大小:296.25KB
  • / 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。

      点击阅读更多内容
      相关文档
      2026高中语文选择性必修中册 - -第一单元综合测试卷.docx 2026高中语文选择性必修中册 - -第二单元综合测试卷.docx 2023-2025三年高考物理真题分类汇编专题10 磁场.docx 2026高中语文选择性必修中册 - -第四单元综合测试卷.docx 广东省东莞市2024-2025学年高一下学期期末考试 语文试卷.docx 广东省东莞市2024-2025学年高一下学期期末考试 数学试卷.docx 山西省临汾部分学校2024-2025学年高一下学期期末联考 生物试卷.docx 2026高中语文选择性必修上册 - -第一单元综合测试卷.docx 山西省临汾部分学校2024-2025学年高一下学期期末联考 化学试卷.docx 2023-2025三年高考物理真题分类汇编专题04 抛体运动与圆周运动.docx 广东省东莞市2024-2025学年高一下学期期末考试 英语试卷.docx 广东省东莞市2024-2025学年高一下学期期末考试 物理试卷.docx 2026高中语文选择性必修上册 - -期中测试卷.docx 山西省临汾部分学校2024-2025学年高一下学期期末联考 英语试卷.docx 山西省临汾部分学校2024-2025学年高一下学期期末联考 数学试卷.docx 2023-2025三年高考物理真题分类汇编专题03 牛顿运动定律.docx 2023-2025三年高考物理真题分类汇编专题02 力的相互作用与受力分析.docx 2026高中语文选择性必修上册 - -第二单元综合测试卷.docx 2026《高考数学一轮复习》4等比数列.docx 2026《高考数学一轮复习》3等差数列及其前n项和.docx
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.