MinGW版本-wxWidgets库编译安装和生成程序DLL依赖问题解决.doc_第1页
MinGW版本-wxWidgets库编译安装和生成程序DLL依赖问题解决.doc_第2页
MinGW版本-wxWidgets库编译安装和生成程序DLL依赖问题解决.doc_第3页
MinGW版本-wxWidgets库编译安装和生成程序DLL依赖问题解决.doc_第4页
MinGW版本-wxWidgets库编译安装和生成程序DLL依赖问题解决.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MinGW-GCC版本、wxWidgets库编译安装和生成程序的mingwm10.dll、 libgcc_s_dw2-1.dll依赖问题解决本文编写和程序配置调试:蔚蓝 ( )/winland0704/home 一、MinGW发行版维基百科:MinGW(Minimalist GNU for Windows),又称Mingw32,是将GNU开发工具移植到Win32平台下的产物,包括一系列头文件(Win32API)、库和可执行文件。 MinGW是从Cygwin(1.3.3版)基础上发展而来,但是用MinGW使用Windows中的C运行库。因此用MinGW开发的程序不需要额外的第三方DLL支持就可以直接在Windows下运行,而且也不一定必须遵从GPL许可证。这同时造成了MinGW开发的程序只能使用Win32API和跨平台的第三方库,而缺少POSIX支持1,大多数GNU软件无法在不修改源代码的情况下用MinGW编译。官网:/ 现在已经有MinGW-w64 - for 32 and 64 bit Windows 项目,可以为为64位Windows提供开发环境。64位版本仍在开发中,有测试版本放出。/projects/mingw-w64/ 除了官方编译的MinGW-GCC版本,还有其他人员自己重新编译打包的发行版,本文中介绍其中的几个。1、MinGW官方版本网址:/projects/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 -enable-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(CodeBlocks和CodeLite带的)网址:/ /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 -enable-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=/recentgcc/bugs.phpThread model: win32gcc version 4.4.1 (TDM-2 mingw32)3、MinGW Distro - 最新版本网址:/mingw.html /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-checking=release -disable-ltoThread model: win32gcc version 4.6.0 (GCC)4、QP-GCC版本网址:/p/qp-gcc/ 这个和后面的PCX版本都是国人弄的,链接库全是静态编译的版本,很好使,编译出来的程序只需要一个exe就可以了。QP版的是CSDN上的Loaden(老邓)大侠弄得:/u/20100302/17/3a465a36-defa-46a3-a913-267c86673579.html /bin包含动态库:mingwm10.dll24KBGCC配置信息:Using built-in specs.Target: i686-mingw32Configured with: ././src/gcc-4.4.5/configure -prefix=/mingw -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-shared -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=Thread model: win32gcc version 4.4.5 (QP MinGW32)5、PCX版本,包括32bit和64bit版本的MinGW网址:/p/pcxprj/ ,编译打包:xunxun1982MinGW_gcc0110317_static_win64.7zMinGW_gcc0110324_static_win32.7z项目主页还有Code:Blocks 静态编译的打包,以及Code:Blocks + 静态MinGW的合集包。未测试,应该和QPGCC版本差不多。这个版本已经更新到GCC 4.6的测试版本了。二、MinGW生成程序的(mingwm10.dll, libgcc_s_dw2-1.dll)DLL依赖问题及解决1、各版本MinGW生成helloworld程序测试代码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,把老版的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.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-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自动生成的wxWidget对话框,跑的不错。都可以独立运行,不需要其他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:wxWidgets-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 ?= 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 (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 (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 Options菜单,打开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值RUNTIME_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,仅底层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。可以使用-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无效。要解除mingwm10.dll依赖必须换编译器。方法一:推荐用QP-GCC(或PCX)的版本 来开发程序,配合静态wx或qt库,生成的exe不需要dll。方法二:下载最新MinGW官方版,配合 -static 参数静态连接,解除dll依赖,也可以生成独立exe。附录:MinGW C运行时库原帖地址:MinGW的安装配置,作者:Breaker/wp/post/mingw-install-config-note/mingwrt-ver-mingw32-dll.tar.gz1、包含mingwm10.dll这个动态链接库,当使用GCC的-mthreads选项(和线程安全异常处理有关)编译时,生成的程序依赖mingwm10.dll。-mthreads 支持Mingw32的线程安全异常处理。对于依赖于线程安全异常处理的程序,必须启用这个选项。使用这个选项时会定义-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 linking with libgcc_s_dw2-1.dll:当在多个模块间,比如:DLL之间或DLL与EXE之间,抛出异常时,如果采用动态链接编译方式,则必需链接到libgcc_s_dw2-1.dll。因此,这是所有除C程序外的程序默认链接方式。如果要禁止动态链接,可以使用-static-libgcc选项,如果要使用C程序的动态链接方式,可以使用-shared-libgcc选项。参考网址维基百科:/zh/MinGW百度百科:/view/975244.htmFreeUPX:/xunlei/xunlei_22409.htmlMinGW:/TDM-GCC:/ MinGW Distro - :/mingw

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论