《MinGW版本-wxWidgets库编译安装和生成程序DLL依赖问题解决.doc》由会员分享,可在线阅读,更多相关《MinGW版本-wxWidgets库编译安装和生成程序DLL依赖问题解决.doc(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流MinGW版本-wxWidgets库编译安装和生成程序DLL依赖问题解决.精品文档.MinGW-GCC版本、wxWidgets库编译安装和生成程序的mingwm10.dll、 libgcc_s_dw2-1.dll依赖问题解决本文编写和程序配置调试:蔚蓝 (winland0704 ) 一、MinGW发行版维基百科:MinGW(Minimalist GNU for Windows),又称Mingw32,是将GNU开发工具移植到Win32平台下的产物,包括一系列头文件(Win32API)、库和可执行文件。 MinGW是从Cygwin(1.3.3版)
2、基础上发展而来,但是用MinGW使用Windows中的C运行库。因此用MinGW开发的程序不需要额外的第三方DLL支持就可以直接在Windows下运行,而且也不一定必须遵从GPL许可证。这同时造成了MinGW开发的程序只能使用Win32API和跨平台的第三方库,而缺少POSIX支持1,大多数GNU软件无法在不修改源代码的情况下用MinGW编译。官网:http:/www.mingw.org/ 现在已经有MinGW-w64 - for 32 and 64 bit Windows 项目,可以为为64位Windows提供开发环境。64位版本仍在开发中,有测试版本放出。 除了官方编译的MinGW-GCC
3、版本,还有其他人员自己重新编译打包的发行版,本文中介绍其中的几个。1、MinGW官方版本网址: /bin包含动态库:libgcc_s_dw2-1.dll 105KBmingwm10.dll 24KBlibstdc+-6.dll 860KBGCC配置信息:Using built-in specs.COLLECT_GCC=gccCOLLECT_LTO_WRAPPER=c:/omingw/bin/./libexec/gcc/mingw32/4.5.2/lto-wrapper.exeTarget: mingw32Configured with: ./gcc-4.5.2/configure -enabl
4、e-languages=c,c+,ada,fortran,objc,obj-c+ -disable-sjlj-exceptions -with-dwarf2 -enable-shared -enable-libgomp -disable-win32-registry -enable-libstdcxx-debug -enable-version-specific-runtime-libs -disable-werror -build=mingw32 -prefix=/mingwThread model: win32gcc version 4.5.2 (GCC)2、TDM-GCC(CodeBlo
5、cks和CodeLite带的)网址:http:/tdm- /bin包含动态库:libgcc_s_sjlj-1.dll 234KBmingwm10.dll 18KBGCC配置信息:Using built-in specs.Target: mingw32Configured with: ././gcc-4.4.1/configure -prefix=/mingw -build=mingw32 -enable-languages=c,ada,c+,fortran,objc,obj-c+ -disable-nls -disable-win32-registry -enable-libgomp -ena
6、ble-cxx-flags=-fno-function-sections -fno-data-sections -disable-werror -enable-threads -disable-symvers -enable-version-specific-runtime-libs -enable-fully-dynamic-string -with-pkgversion=TDM-2 mingw32 -enable-sjlj-exceptions -with-bugurl=Thread model: win32gcc version 4.4.1 (TDM-2 mingw32)3、MinGW
7、Distro - 最新版本网址: /bin包含动态库:mingwm10.dll 27KBGCC配置信息:Target: i686-pc-mingw32Configured with: ./src/configure -prefix=/c/temp/gcc/dest -enable-languages=c,c+ -with-arch=i686 -with-tune=generic -disable-libstdcxx-pch -disable-nls -disable-shared -disable-sjlj-exceptions -disable-win32-registry -enable-
8、checking=release -disable-ltoThread model: win32gcc version 4.6.0 (GCC)4、QP-GCC版本网址: 这个和后面的PCX版本都是国人弄的,链接库全是静态编译的版本,很好使,编译出来的程序只需要一个exe就可以了。QP版的是CSDN上的Loaden(老邓)大侠弄得: /bin包含动态库:mingwm10.dll24KBGCC配置信息:Using built-in specs.Target: i686-mingw32Configured with: ././src/gcc-4.4.5/configure -prefix=/ming
9、w -host=i686-mingw32 -target=i686-mingw32 -build=i686-pc-linux-gnu -enable-languages=c,c+ -enable-static -enable-cxx-flags=-fno-function-sections -fno-data-sections -enable-fully-dynamic-string -enable-version-specific-runtime-libs -enable-threads=win32 -enable-libgomp -enable-libiconv -disable-shar
10、ed -disable-nls -disable-werror -disable-libstdcxx-pch -disable-win32-registry -disable-sjlj-exceptions -with-dwarf2 -with-gmp=/home/loaden/AUR/mingw32/depends -with-mpfr=/home/loaden/AUR/mingw32/depends -with-pkgversion=QP MinGW32 -with-bugurl=http:/qp-Thread model: win32gcc version 4.4.5 (QP MinGW
11、32)5、PCX版本,包括32bit和64bit版本的MinGW网址: ,编译打包:xunxun1982MinGW_gcc4.5.3.20110317_static_win64.7zMinGW_gcc4.5.3.20110324_static_win32.7z项目主页还有Code:Blocks 静态编译的打包,以及Code:Blocks + 静态MinGW的合集包。未测试,应该和QPGCC版本差不多。这个版本已经更新到GCC 4.6的测试版本了。二、MinGW生成程序的(mingwm10.dll, libgcc_s_dw2-1.dll)DLL依赖问题及解决1、各版本MinGW生成hellowo
12、rld程序测试代码main.cpp:#include #include #include using namespace std;int main(int argc, char *argv)printf(Hello World!n);coutEnvironment Variables:Environment Variables对话框中,把WXWIN路径改成新的:D:wxWidgets-2.8.12并把PATH和WXCFG里的gcc_dll改成gcc_lib。第二处:Settings菜单-Tags Settings:在Tags Options对话框里,选中左边Include Files,把老版的
13、wxinclude目录删掉,上面列表加上新的:D:wxWidgets-2.8.12include下面列表加上新的:D:wxWidgets-2.8.12includewxuniv D:wxWidgets-2.8.12includewxunix然后重启CodeLite。wxHello对话框(就一个框,一个OK按钮,一个Cancel按钮),编译生成后:Debug版本:28MBRelease版本:1.94MB这个debug版够大的,wxWidgets大概就这样吧。这里生成的exe都是独立运行的,不需要mingwm10.dll,不需要libgcc_s_dw2-1.dll或libgcc_s_sjlj-1.
14、dll 。也不需要wxWidgets的dll动态库。4、wxWidgets库编译安装(QP-GCC编译环境)和去DLL依赖与上面类似:QP-MinGW目录在:D:MinGW wx目录在D:wxWidgets-2.8.12设置cmd编译环境 set PATH=D:MinGWbin;%PATH%设置wxWidgets-2.8.12的编译配置文件:D:wxWidgets-2.8.12buildmswconfig.gcc改为:SHARED ?= 0UNICODE ?= 1BUILD ?= debugRUNTIME_LIBS ?= dynamic编译生成wx静态库 $ cd /d D:wxWidgets
15、-2.8.12buildmsw $ make -f makefile.gcc编译好debug版静态wx库后,再修改config.gcc为SHARED ?= 0UNICODE ?= 1BUILD ?= releaseRUNTIME_LIBS ?= dynamic然后编译: $ make -f makefile.gcc等编译好后,debug和release静态库就都可以用了。测试,CodeLite不好弄,因为要换MinGW,搞挂了。所以换了CodeBlocks最简版的,不带MinGW。然后自己设置MinGW路径,还有wx路径,还不错,设置好路径就可以跑程序。程序使用codeblocks自动生成的w
16、xWidget对话框,跑的不错。都可以独立运行,不需要其他DLL。Debug版本:28.7MBRelease版本:1.97MB由于使用的QP-GCC,这个也是静态编译的GCC,默认使用静态C运行时库,可以生成独立的exe程序。和TDM-GCC差别不大。5、wxWidgets库编译安装(MinGW官方编译环境)和去DLL依赖与上面类似:官方MinGW目录在:C:OMinGW wx目录在D:wxWidgets-2.8.12 ;(将D:wxWidgets-2.8.12buildmswgcc_mswud和D:wxWidgets-2.8.12buildmswgcc_mswu目录里清空,将D:wxWidg
17、ets-2.8.12libgcc_lib 目录里清空)设置cmd编译环境 set PATH=C:OMinGWbin;%PATH%设置wxWidgets-2.8.12的编译配置文件:D:wxWidgets-2.8.12buildmswconfig.gcc改为:SHARED ?= 0UNICODE ?= 1BUILD ?= debugRUNTIME_LIBS ?= dynamic编译生成wx静态库 $ cd /d D:wxWidgets-2.8.12buildmsw $ mingw32-make -f makefile.gcc编译好debug版静态wx库后,再修改config.gcc为SHARED
18、 ?= 0UNICODE ?= 1BUILD ?= releaseRUNTIME_LIBS ?= dynamic然后编译: $ mingw32-make -f makefile.gcc等编译好后,debug和release静态库就都可以用了。测试,将CodeBlocks的GCC编译器路径设置到C:OMinGW就行了。Wx库路径仍是D:wxWidgets-2.8.12测试程序使用codeblocks自动生成的wxWidget对话框,编译连接wxHello对话框程序,Debug版本:27.9MBRelease版本:1.76MB这时需要依赖底层C运行时库的DLL:libgcc_s_dw2-1.dll
19、 (105KB) 和 libstdc+-6.dll (860KB)因为MinGW官方GCC默认使用底层动态链接库,所以需要额外的dll。进一步测试,将里的RUNTIME_LIBS ?= dynamic 换为 RUNTIME_LIBS ?= static,重新生成debug和release库,结果让人失望,用RUNTIME_LIBS ?= static生成的wx库,使用wx库编程序,依然依赖libgcc_s_dw2-1.dll (105KB) 和 libstdc+-6.dll (860KB)。所以RUNTIME_LIBS参数从目前来看对解除dll依赖没啥用。libgcc_s_dw2-1.dll
20、(105KB) 和 libstdc+-6.dll (860KB)是否被依赖,由写应用程序,生成该应用程序的编译连接环境决定。QP-GCC全静态连接库,生成的就不依赖DLL。MinGW官方默认是用动态链接库,所以默认是依赖C运行时DLL的,当然可以用-static使用静态连接的底层C运行库。去除dll动态库依赖:用底层RUNTIME_LIBS ?= dynamic动态链接C运行时库编译生成wx,使用wx编写应用程序时,在连接命令里附加参数:-static,如同 二、1 里面的helloworld程序连接参数一样。在CodeBlocks里,右击左边wxHello对话框项目,选择Build Opti
21、ons菜单,打开Project build options对话框,选中左边Debug,再选右边Linker settings,看到右边Other linker options列表里,添加 -static ;选Release的设置,再选右边Linker settings,看到右边Other linker options列表里,添加 -static 。添加 -static 后,程序编译出来的就是不依赖其他DLL的。生成的wxHello.exe Debug大小:28MB,Release大小:1.86MB不依赖其他DLL。6、wxWidgets库编译方式对比,和依赖库状况编译方式比较项SHARED值R
22、UNTIME_LIBS 值用wx生成应用程序exe依赖的动态dll库DLL依赖解除方法TDM-GCC(4.4.1)全动态编译wxCodeLite自带的1dynamicwxmsw28u_gcc_custom.dll和mingwm10.dll,上层图形库和底层运行时库都要。换全静态wxTDM-GCC(4.4.1)全静态编译wx0被无视,默认为static无不需要QP-GCC (4.4.5)全静态编译wx0被无视,默认为static无不需要MinGW官方GCC(4.5.2) 静态编译wx0static被无视,同下面dynamiclibgcc_s_dw2-1.dll和libstdc+-6.dll,仅底
23、层C运行时库。使用连接参数:-static MinGW官方GCC(4.5.2)半静态编译wx0dynamiclibgcc_s_dw2-1.dll和libstdc+-6.dll,仅底层C运行时库。使用连接参数:-static SHARED值决定生成的上层wx图形库是动态链接或静态链接。决定需不需要连接wxmsw28u_gcc_custom.dll。RUNTIME_LIBS 基本被无视,与编译环境的默认配置相关,编译器默认使用静态C运行库(QP-GCC),那么就不需要libgcc_s_dw2-1.dll、libstdc+-6.dll。像MinGW官方默认使用动态C运行库,那么就需要这两个dll。可
24、以使用-static连接参数解除对dll的依赖。三、老版本MinGW生成的程序对libgcc_s_dw2-1.dll、mingwm10.dll依赖问题的解决注意:上面的MinGW官方版本是GCC 4.5.2,老些的版本生成程序默认需要libgcc_s_dw2-1.dll、mingwm10.dll,见附录介绍。1、解除libgcc_s_dw2-1.dll依赖,使用-static-libgcc选项连接。2、解除mingwm10.dll依赖,这由编译连接器发行版本决定,使用-static能解除对其他如libgcc_s_dw2-1.dll的依赖,但是对mingwm10.dll无效。要解除mingwm1
25、0.dll依赖必须换编译器。方法一:推荐用QP-GCC(或PCX)的版本 来开发程序,配合静态wx或qt库,生成的exe不需要dll。方法二:下载最新MinGW官方版,配合 -static 参数静态连接,解除dll依赖,也可以生成独立exe。附录:MinGW C运行时库原帖地址:MinGW的安装配置,作者:Breakermingwrt-ver-mingw32-dll.tar.gz1、包含mingwm10.dll这个动态链接库,当使用GCC的-mthreads选项(和线程安全异常处理有关)编译时,生成的程序依赖mingwm10.dll。-mthreads 支持Mingw32的线程安全异常处理。对
26、于依赖于线程安全异常处理的程序,必须启用这个选项。使用这个选项时会定义-D_MT,它将包含使用选项-lmingwthrd连接的一个特殊的线程辅助库,用于为每个线程清理异常处理数据。GCC 4.4.0 C+的RT库/标准库使用GNU的libstdc+-6的Windows移植版,C+标准库头文件的位置为:/lib/gcc/mingw32/4.4.0/include/c+2、使用GCC 4.4.0默认选项编译C+代码,生成的程序会依赖libgcc_s_dw2-1.dll,参考GCC 4.4.0 Release Notes and Changelog5. GENERAL NOTESDynamic li
27、nking with libgcc_s_dw2-1.dll:当在多个模块间,比如:DLL之间或DLL与EXE之间,抛出异常时,如果采用动态链接编译方式,则必需链接到libgcc_s_dw2-1.dll。因此,这是所有除C程序外的程序默认链接方式。如果要禁止动态链接,可以使用-static-libgcc选项,如果要使用C程序的动态链接方式,可以使用-shared-libgcc选项。参考网址维基百科:http:/zh.wikipedia.org/zh/MinGW百度百科:FreeUPX:MinGW:http:/www.mingw.org/TDM-GCC:http:/tdm- MinGW Distr
28、o - :QP GCC:PCXPRJ MinGW:wxWidgets:http:/www.wxwidgets.org/CodeLite:http:/www.codelite.org/Code:Blocks:http:/www.codeblocks.org/CSDN: MinGW 的安装配置:跨平台的C+ GUI库wxWidgets编译: wxWidgets 2.9.2svn(3.x)最小体积编译方法: wxWidgets编译简介 : wxWidgets官方论坛:http:/forums.wxwidgets.org/ 或者 有中文版块,wxWidgets Development (Chinese)Qt: QtCentre:http:/www.qtcentre.org/forum.php QtCentre-Removing dependencies for mingwm10.dll and libgcc_s_dw2-1.dll,static linking? :http:/www.qtcentre.org/threads/29489-Removing-dependencies-for-mingwm10.dll-and-libgcc_s_dw2-1.dll-static-linking Qt中文论坛:http:/www.qtcn.org/bbs/