mingw qt(可以去掉mingwm10.dll、libgcc_s_dw2-1.dll、libstdc++-6.dll的依赖,官方的mingw默认都是动态链接gcc的库而TDM是静态链接gcc库,tdm版本更好用)

原文地址:mingw qt作者:孙1东

不使用Qt SDK,使用mingw编译qt源代码所遇问题及解决方法:

configure -fast -release -no-exceptions -no-rtti -no-stl -no-qt3support -no-opengl -no-multimedia -no-webkit -no-script -no-scripttools -nomake tools -nomake examples -nomake demos -nomake docs -nomake translations -platform win32-g++

强烈推荐使用tdm版本的mingw gcc,相比官方mingw的慢速,晦涩,tdm的安装过程简单,清晰,更新也快,而且官方的mingw开发人员也在使用tdm(为啥不合并了算了呢)。

【关于mingw10.dll,libgcc_s_dw2-1.dll,libstdc++-6.dll】

mingwm10.dll是线程安全的异常处理时用到的清理函数,否则将会有内存泄漏。

libgcc_s_dw2-1.dll是gcc 的核心运行库。

libstdc++-6.dll 是gcc支持的特定语言c++的运行库。

用mingwrt3.18之前编译出来的qt库,默认依赖mingwm10.dll。使用mingwrt3.18编译qt库不再依赖mingwm10.dll。编译出来的qt库不能用upx进行压缩,这个确认是upx的bug,因为使用aspack是没有问题的。如果想在3.18以前去掉依赖,由于qt本身不使用异常处理,所以可以在configure的时候,选项 -no-exceptions 禁止异常处理从而去掉对mingwm10.dll的依赖,并且这样编译出来的qt库体积还缩小不少。
用官方gcc4.4.0编译出来的qt库,默认依赖libgcc_s_dw2-1.dll,gcc-4.5.0默认还多一个依赖libstdc++-6.dll。官方的mingw默认都是动态链接gcc的库而TDM是静态链接gcc库。使用官方mingw要想去掉对gcc核心库libgcc_s_dw2-1.dll依赖的话,可以在编译qt库之前修改QTDIR/mkspec/win32-g++/qmake.conf,QMAKE_LFLAGS = -static-libgcc。或者configure之后修改QTDIR/.qmake.cache,QMAKE_LFLAGS += -static-libgcc。取消对c++运行库libstdc++-6.dll的依赖,使用选项-static-libstdc++。修改QTDIR/.qmake.cache顺便还可以选择不编译examples,demos等等部件,只保留libs。或者configure的时候指定 -nomake tools -nomake examples -nomake demos -nomake docs -nomake translations

相对官方mingw的繁杂,使用tdm版的mingw的好处很多,首先,安装过程简单清楚,其次产生的qt库不依赖libgcc_s_dw2-1.dll,libstdc++-6.dll,并且如果用tdm-gcc-4.5.0(mingw-runtim-3.18)的话,连mingwm10.dll也不需要了。tdm有两个版本,sjlj和dw2,这是两种不同的异常处理方式,sjlj是老的方式,速度慢,可能更稳定些;dw2是新的方式,速度更快。tdm4.5.0默认是用sjlj的,当然也提供了dw2的版本。除了下载官网上给出的dw2版本的文件,可能需要再下个libexpat-2.0.1-1-mingw32-dll-1.tar.gz,(不知道缺了会怎样),因为我试了用on-demand安装的时候,选dw2,他是会安装libexpat.dll的。然后把所有带-dw2的重命名为不带dw2的,比如g++-dw2重新命名为g++,tdm的说明里说这两个版本可以和平共处,后面有如何做到。

【使用gcc 4.4.0编译出现乱码】

gcc4.4会自动检测当前的locale,并产生相应的输出。如要使用纯英文环境,设置一下环境变量 LANG=C 或者 LANG=en_US。

【有时候编译QT会出错误:qtvariantproperty.cpp:1927: internal compiler error】

具体原因未知,有人说是gcc的bug,我怀疑跟内存使用情况有关。所以最好是编译过程中不要搞别的动作,这样会大大减少出现这种情况的几率。不过既然有时候还是会出现这样的问题也得有个解决办法,经过研究可以这样:先去QTDIR/tools/designer/src/lib下,删除tmp目录以及所有qmake生成的makefile,手动qmake,生成makefile,此时先别make,虽然这时可以成功,但后面的编译无法继续,所以要先回到QTDIR目录,再make。

【使用gcc4.5.0编译qt4.6.2,报错0xc00000005】

按照gcc4.5.0的说明也不能解决,其实qt的conf文件里面已经添加有这样选项。

使用tdm-gcc-4.5.0(sjlj或者dw2均可)。

【默认编译QT时不编译phonon模块】

mingw需要打上相应的补丁 补丁中所有文件放到mingw/include下,为了使用补丁还需要下载MSYS 和patch,patch用法:patch < dshow.patch,这样就打好补丁了。这样在configure qt时,就会自动检测到系统支持phonon,于是phono库将被编译。单独安装的MSYS(core)使用某些命令时会出现warning:terminal is not fully functional (press RETURN),这是由于没有设置/etc/termcap,使用MSYS完整安装版把它下面的termcap考过来就可以了,或者干脆就用完整安装的MSYS算了,就是版本稍老一点而已,那里面基本上什么都有了。

【编译dbus】

dbus跟phonon一样,也是需要额外支持才能编译,首先下载windbus,地址 src/dbus make

【安装qt之后,改变qt的位置】

qt编译完了目录不能随便改名,否则会出现某文件找不到的情形,qt编译时把当前qt的路径硬编码到qt库中以及qmake中,等等,所以不能随便改名。如果要改名可以:

1.使用qpatch,这个是qtcreator带的小工具,当安装qt sdk的时候,安装程序就是通过运行qpatch来更改qt安装目录的。使用方法:qpatch files-to-patch-windows oldQtDir newQtDir。假设原来的安装目录是C:Qt2010.04,改名后的目录为C:Qt2000.00。运行命令行,进入C:Qt2000.00bin目录,qpatch files-to-patch-windows C:/Qt/2010.04/qt c:/qt/2000.00/qt,files-to-patch-windows指定的替换文件列表都是位于qt目录下的,也就是prefix=C:/Qt/2010.04/qt,qpatch 会根据c:/qt/2000.00/qt+files-to-patch-windows找出所有需要替换的文件。这里需要注意大小写,奶奶的,看来Qt的工程师也有不少缺心眼的,windows下比较目录字符串居然是大小写敏感的,害的我琢磨了半天,明明看着有这个路径居然替换不了,好在老夫灵光一闪,嗯。。我真聪明。使用qpatch有个限制就是改名后的目录长度不能大于原来的长度,这也就是为什么安装包里未解压出来的默认目录是一大长串的原因。

2.还有一种方法可以使用qt.conf:,在qt/bin下创建文件qt.conf,其内容如下:

[Paths]
Prefix = C:/xxx/yyy

老外说prefix指向的目录必须包含.LICENSE-EVALUATION这个文件,当然一般都是这样。

这样可以从一个地方build出多个qt的版本放到不同的位置,编译好后,不需要的目录可以删除,保留bin,lib,plugins,tools,include,src,mkspecs.这样qtcreator就能正确识别qt不同版本.

【qtcreator中按F1获取上下文帮助,显示No documentation available】

尤其装了多个版本的qt,很容易造成这种混乱,

xp系统下,删除C:Documents and SettingsAdministratorApplication DataNokia。

win7系统下,删除C:UsersdarkAppDataRoamingNokia

再重新启动qtcreator即可。

【qtcreator1.3.1->Tools->Options->Qt versions->Debugging Helper显示红叉叉】

先rebuild,一切正常的话,将在QTDIR/qtc-debugging-helper目录下生成gdbmacros.dll,这样就变绿勾勾了。不过虽然可以找到helper库,但是在调试程序的时候还是不能正确显示Qt类以及stl,提示debugging helpers not found,金山打字通2010免费下载。后经反复验证,发现原因是gdb版本不匹配,我自己安装的mingw用的是gdb7.1而debugging helper只能支持到gdb6.8。解决方法为使用qtcreator自带的mingw中的gdb或者自己下个gdb6.8。还有一种情况,好像必须得在qt程序(至少qtcore)里才行,纯c++的程序也会提示debugging helpers not found。

【qt 4.6.3静态编译后使用出错】

编译的过程没有问题,但是使用libQtGui.a的时候报错:

undefined reference to ‘_imp___Z21qt_call_post_routinesv‘
undefined reference to ‘_imp___Z21qDeleteInEventHandlerP7QObject‘

这个是qt的bug,使用4.6.2没有问题

【编译选项杂项】

修改$QTDIRmkspecsCOMPILERqmake.conf,其中COMPILER=win32-g++或者msvc-2008

win32-g++: QMAKE_CFLAGS_RELEASE    = -Os -momit-leaf-frame-pointer
msvc-2008: QMAKE_CFLAGS_RELEASE    = -O1 -Og  -GL -MD

For anyone who is interested in a compiling fully static libraries for msvc (no msvcrtXX.dll dependence), you need change the QMAKE_CFLAGS_RELEASE from -MD to -MT, and add /NODEFAULTLIB:”MSVCRT” to the QMAKE_LFLAGS_RELEASE.

tdm 的dw2版,不改名,编译即使用:gcc-dw2,g++-dw2,cpp-dw2,mingw32-gcc-dw2等等

首先修改QTDIR/qmake/Makefile.win32-g++:

CXX        =    g++-dw2

LINKQMAKE   =    g++-dw2 $(LFLAGS) -o qmake.exe $(OBJS) $(QTOBJS) $(LIBS)

这样,qmake就可以正常生成了,接下来是qt库,

再修改QTDIR/mkspecs/win32-g++/qmake.conf

QMAKE_CC        = gcc-dw2

QMAKE_CXX        = g++-dw2

QMAKE_LINK        = g++-dw2
QMAKE_LINK_C        = gcc-dw2

QMAKE_RC        = windres --preprocessor=cpp-dw2

注意最后一个windres 调用gcc,gcc又调用cpp所以,直接cpp-dw2,不然还是找不到。

【qwt以及一般的designer插件】

qwt是一个绘制统计图的库,也作为designer的插件集成到qtcreator里,这里需要注意的问题是

IDE与编译器的配合:如果使用的是qtsdk自带的qtcreator,由于它本身是用msvc编译的,为了使qwt的插件能被qtcreator识别,必须使用msvc编译qwt,产生两个dll,一个是qwt designer的插件qwt_designer_plugin5.dll这个放在qtcreator的designer目录下,不过此时运行qtcreator还是不能显示qwt的插件,因为它还依赖qwt.dll。再将qwt5.dll放到qtcreator的bin目录下,这样再运行qtcreator就可以看见qwt的插件了。然而事情还没有完,当应用程序使用qwt类库的时候,由于qt sdk的编译器是mingw,所以必须使用mingw重新编译qwt的类库,生成的designer插件就不需要了,生成的libqwt5.a放在qt/lib下或者随便什么地方,这个导入接口库只是为了编译能成功,生成的qwt5.dll放在qt/bin下,或者直接放在可执行文件的目录下,这是运行时真正要调用的。

明白了以上,那么当然更好的办法就是不用qt sdk,而是统一使用msvc编译,于是这样组合:下载单独的qtcreator(默认为msvc编译)+qt library msvc,这样只需编译一次qwt即可。

下载msvc 2008 express,安装
下载单独的qt creator(默认使用msvc编译),安装
下载qt libraries (msvc版),安装
打开qtcreator 将编译环境指定为使用刚刚下载安装的qt (msvc版)
下载qwt-5.2.1源代码,解压
使用qtcreator打开qwt工程,编译release版本
将qwt-build-desktopdesignerpluginsdesignerqwt_designer_plugin5.dll放到qtcreatorbindesigner目录下
将qwt-build-desktoplibqwt5.dll放到qtcreatorbin目录下
重新运行qtcreator你将会看到designer里已经有qwt的控件出现,但还不能应用于程序中
为了让程序中能使用qwt控件,还需再做几件事
将qwt-build-desktoplibqwt5.lib放到qtlib目录下
将qwt-build-desktoplibqwt5.dll放到qtbin目录下
重新运行qtcreator,新建一个工程,随便拽个qwt控件到form上
.pro中添加:
LIBS += -lqwt5
INCLUDEPATH += qwt-5.2.1src 这里使用你自己的路径
现在可以试试效果了

【LIBS vs LIBS_PRIVATE】

首先记住LIBS或者LIBS_PRIVTE,-Lpath -lname 后面都不能有空格。path中有空格的话

$$quote(-Lpath),path中可以使用""或者"/"都可以,不需要转义""。

有时候很诡异,LIBS -L"path" -l"name"不起作用,而放到默认的qt/lib下就行。

这时可考虑使用LIBS_PRIVATE,还不行就直接完整路径。

【多核编译】

mingw32-make 参数设置 --jobs 或者 -j x ,x 是处理器的个数+1,貌似不起作用,设置了MAKEFLAGS=-j3也不行,或许根据环境自动就-jx了?

qtcreator自动使用jom代替nmake,我的双核,jom -j 2,果然cpu占用达到了100%.

【meta object system】

meta object system除了实现了signal/slot,还实现了C++的扩展RTTI,类似java中的反射,运行时获取类的所有信息。

由於qmake?不??理 .cpp中的Q_OBJECT(通常也很少有人?把Q_OBJECT?在.cpp,而是?在.h中),所以,如果.cpp中有Q_OBJECT的?,?? ?生出 undefined reference to ‘vtable for xxx ????.添加#include "xxx.moc" 放到 xxx.cpp 最尾端(一定要放最後一行)

【mingw dll 与 msvc dll】

不同的编译器实现dll导出名字(name mangling)是不同的,对函数导出,我们可以使用统一的,经过extern "C" 处理过的不带修饰的名字从而实现互联互通;而对类的导出则复杂得多,涉及ABI(Application Binary Interface)的问题,需另外讨论。

app 调用 dll 可分为4种情况:

1.mingw app调用 mingw dll

当然自家人认识自家人,pro里直接LIBS += mingw.dll就可以,甚至不需要.a或者.lib

2.msvc app 调用 mingw dll

msvc app架子大,不认别人,直接使用mingw.a导入库是不行的,至少release app不行,debug app倒还凑合能跑,原因未知。正确的方法为使用msvc的工具 生成msvc app需要的lib接口. 为了生成lib接口,我们需要有个def文件,这个可以在编译mingw dll时自动生成,加入链接选项:QMAKE_LFLAGS += -Wl,--output-def,xxx.def.有了def 接下来的事情就简单得很了。执行:lib /machine:i386 /def:xxx.def.这样就生成了msvc app所需的xxx.lib和一个没用的xxx.exp.

然后再pro里LIBS += xxx.lib就行了

3.mingw app 调用 msvc dll

同 1. 直接LIBS += msvc.dll

Usually (read: for all DLLs created with MinGW and also a few others) MinGW links fine against a DLL.  No import library is necessary .

4. msvc app 调用 msvc dll

没啥说的

【使用QtTest】

QT += testlib 或者 CONFIG += qtestlib

http://blog.sina.com.cn/s/blog_930982070101edqf.html

原文地址:https://www.cnblogs.com/findumars/p/8289593.html

时间: 2024-11-03 05:44:23

mingw qt(可以去掉mingwm10.dll、libgcc_s_dw2-1.dll、libstdc++-6.dll的依赖,官方的mingw默认都是动态链接gcc的库而TDM是静态链接gcc库,tdm版本更好用)的相关文章

Qt编译时MinGW去掉对gcc动态库的依赖(去掉对libgcc_s_dw2-1.dll,libstdc++-6.dll的依赖)

用Qt写点东西,我一般是下载官方的MinGW编译工具包,它有个不好的地方,经常还会多一些除了Qt库以外的其它的依赖动态链接库,比如:libgcc_s_dw2-1.dll,libstdc++-6.dll这样的鬼东西,之前用CodeBlock的时候发现没有这样的现像,就感觉很奇怪,于是仔细查找了一此资料,原来这些东西可以通过设置编译器选项把它们去掉的,其实就是改成静态链接依赖库中的代码. 我这里是直接修改Qt编译后的配置,找到QTDIR/mkspec/win32-g++ /qmake.conf,QM

Qt下使用的静态链接库------ *.lib转化为mingw使用的.a格式的静态库

使用MinGW附带的工具reimp.exe,该工具一般在MinGW in目录下,其readme文档在MinGWdoc eimp目录下, 方法很简单,比如: C:CodeBlocksMinGWlibdx9>reimp d3d8.lib 就会生成一个“libd3d8.a”文件,这个文件就可以让基于MinGW的编译器链接使用了. 我用这个方法成功的把DirectX9c的.lib库转化成了.a库,并在CodeBlocks下编译成功了其生成的dx项目, 但是有三个.lib文件无法通过这个方法转换:DxEr

MinGW 创建的程序或 DLL 脱离 libgcc-xx-xx.dll 和 libstdc++-x.dll 运行库的方法

MinGW 沿袭了 Linux 下 gcc/g++ 的习惯,编译出的程序或者动态链接库(共享库)总是默认采用动态链接方式,需要系统中附带运行时库文件 libgcc-xx-xx.dll 和 libstdc++-xx.dll.那么如果我们不想发布程序时还要附带这两个运行库,该如何操作呢?通过参考 gcc/g++ 用户手册,发现只需要在编译器或链接器参数设置中使用 -static-libgcc 和 -static-libstdc++ 即可实现对这两个运行库的静态库链接,不必附带运行库了.如果采用参数

Windows10 解决“装了 .NET Framework 4.5.2/4.6.1/4.7.1等等任何版本 或版本更高的更新”问题

========================================================= 系统自带的.net framework版本为4.7,自己安装.NET Framework 4.5.2时会提示:这台计算机中已经安装了 .NET Framework 4.5.2 或版本更高的更新. 解决方法如下: 下载安装.net framework的开发版或者说开发包 下载地址如下: https://dotnet.microsoft.com/download/visual-stud

Qt官方开发环境生成的exe发布方式--使用windeployqt(windeployqt是单独的程序,放在低版本qt4目录下也可以运行的)

Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行.因此 Qt 官方开发环境里自带了一个工具:windeployqt.exe.以官方 Qt 5.4.0+MinGW 开发环境为例,从开始菜单-->Qt 5.4.0-->5.4-->MinGW 4.9 (32-bit)-->Qt 5.4 for Desktop (MinGW 4.9 32 bit),可以打开 Qt 命令行,从这

dll和lib(包括静态链接库和与dll同时生成的lib)

转:http://blog.csdn.net/galaxy_li/article/details/7411956 1:神马是Dll和Lib,神马是静态链接和动态链接 大家都懂的,DLL就是动态链接库,LIB是静态链接库.DLL其实就是EXE,只不过没main. 动态链接是相对于静态链接而言的.所谓静态链接就是把函数或过程直接链接到可执行文件中,成为可执行程序中的一部分,当多个程序调用同样的函数时,内存里就会有这个函数的多个拷贝,浪费内存资源.而动态链接则是提供了一个函数的描述信息给可执行文件(并

动态链接库dll,导入库lib,静态链接库lib

目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”).  静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起.比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子.  动态库一般会有对应的导入库,方便程序静态载入动态链接库,否则你可能就需要自己Load

java.lang.UnsatisfiedLinkError: D:\apache-tomcat-7.0.57\bin\tcnative-1.dll: Can&#39;t load IA 32-bit .dll on a AMD 64-bit platform 错误

为了开发JavaWEB,安装了MyEclipse,在运行tomcat的时候发现报错:java.lang.UnsatisfiedLinkError: D:\apache-tomcat-7.0.57\bin\tcnative-1.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform.自己上网查了下,发现这个错误对于项目的运行时没有什么大碍的,可能自己有强迫症,总是想没错,就上网找了解决方法.我先麻烦,就选择了最简单的方法,去tomcat目录下

java.lang.UnsatisfiedLinkError: D:\apache-tomcat-7.0.52\bin\tcnative-1.dll: Can&#39;t load AMD 64-bit .dll on a IA 32-bit platform

正如标题,一大早遇到这个错误: java.lang.UnsatisfiedLinkError: D:\apache-tomcat-7.0.52\bin\tcnative-1.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform 虽不影响项目运行,但我觉得心里始终是不踏实. 于是查找各种资料,现总结如下:1. 检查Myeclipse->help->About MyEclipse Enterprise Workbench->Insta