CodeBlock速配wxWidgets[U版]

本文详细介绍了如何在CodeBlock中配置wxWidgets进行动态和静态编译,包括设置编译选项、使用wxPack、实操测试及解决常见错误。推荐的稳定组合是CodeBlock 10.05与wxPack_v2.8.12,以及CodeBlocks 13.12与wxMSW 3.0。文章提供了测试数据和解决动态链接、静态链接时的错误方法,强调了正确设置编译器参数和库文件的重要性。此外,文章还讨论了不同编译器版本的兼容性和效率问题,以及如何使用RAD工具提升开发效率。
摘要由CSDN通过智能技术生成

CodeBlock速配wxWidgets[U版]


使用软件版本:

  • CodeBlocks 10.05 自带 mingw32-g++.exe (TDM-2 mingw32) 4.4.1
  • CodeBlocks 13.12 自带 mingw32-g++.exe (TDM-2 mingw32) 4.8.1
  • wxPack_v2.8.7.exe GCC编译版本未知,此包安装后占用空间明显比2.8.12要大(3.10G>1.45G)
  • wxPack_v2.8.12.01.exe 由GCC 4.4.1 编译
  • wxMSW-3.0.2_gcc471TDM_Dev.7z + wxWidgets-3.0.2_headers.7z
  • tdm-gcc 各个实测版本
  • Microsoft Windows 7 专业版 6.1.7600
  • AMD64 Family 16 Model 5 Stepping 3 AuthenticAMD ~1600 Mhz 4G 内存

动态编译

下载好各版本的 wx 或者是 wxPack_v2.8.7.03,wxPack 包含的库文件较全,要正确编译工程,就需要设置定义以下编译选项,否则配置不正确,就算编译通过也无法运行:

<Add option="-DWXUSINGDLL" />
<Add option="-DwxUSE_UNICODE" />

这两个选项是对应工程向导中的 Use wxWidgets DLL 和 Enabled Unicode 两个选项。

静态编译和合集库

wxPack安装包含动态链接和静态链接两个版本的文件,lib目录下gcc_dll对应动态链接,gcc_lib对应静态连接,这个文件夹也是没有DLL文件的,需要在编译选项中设置好路径指向。gcc_lib目录下就有这四个文件,分別是Unicode和非U版的,特别大的文件:

libwxmswu.a     98MB
libwxmswud.a    99MB
libwxmsw.a      17MB
libwxmswd.a     17MB

如果准备编译wx源代码如 wx 2.8.6,需要准备好 mingw32-make 3.8以上版本,编译wx时生成合集库文件,即 Monolithic Library,需指定MONOLITHIC=1,需要静态编译时要指定SHARED=0,这样才能进行静态链接的程序开发,j4表示四线程编译,如果有个4核的CPU就可以用它来提速,例如:

mingw32-make -j4 -f makefile.gcc MONOLITHIC=1 SHARED=0 UNICODE=1 BUILD=debug
mingw32-make -j4 -f makefile.gcc MONOLITHIC=1 SHARED=0 UNICODE=1 BUILD=release

以上使用的编译参数可以在wx安装目录下的build子目录下的配置文件找到,也可以直接修改配置文件来达到同样的效果。在构建合集库最后的链接阶段是非常耗内存,如果使用较新版的 mingw 编译则可以添加以下参数来尽量避免内存不足的问题,如果需要编译动态链接+DEBUG+MONOLITHIC则强烈建议采用,否32位机的内存很快就会被吃光 Memory exhausted。因此建议机子配置不高的情况下不要进行这样的高要求编译任务,否则到最后得来一句就是浪费电!

CXXFLAGS=-fno-keep-inline-dllexport  不导出内联符号,损失内联符号调试信息
USE_EXCEPTIONS=0 禁用内部异常处理
USE_RTTI=0  禁用内部运行时类型机制

官方文档 Reducing Executable Size 指导减小程序大小明确提到可以禁用RTTI,因此去掉这部分功能可以节省可观的内存。因为使用mingw平台来开发wxWidgets程序有大量的好工具可以使用,因此MS编译平台不是优先选择目标。但值得注意的是,MSVC的编译器生成的代码确实要比mingw的小,因此可以考虑在最后的编译阶段切换到MSVC平台下编译。要使用mingw编译wxWidgets源代码,可以直接进入win平台的配置目录:

@wxWidgets-2.8.12\build\msw

按以上提示进行修改,或保持默认值,通过命令行进行配置,并执行编译命令,或保存为脚本执行。由于当前使用 TDC-GCC 4.7.1中没有自带libgcc_s_dw2-1.dll,而make命令又需要,因此直接从 4.8.1版本拷贝过来一份。命令中修改了VENDOR这个参数,因为它会影响编译结果输出的文件名后缀,默认值是custom,所以一些没有修改这个参数的编译结果就会带custom这个后缀。:

set mingw=C:\CodeBlocks\mingw471
set path=%mingw%\bin
set flags=INCLUDE="%mingw%\include" LIB="%mingw%\\lib"
set opts=BUILD=release UNICODE=1 VENDOR="" GCC_VERSION=4.7.1
set mod=MONOLITHIC=1 USE_GUI=1 USE_GDIPLUS=1 USE_OPENGL=1
set libtype=RUNTIME_LIBS=static SHARED=0
mingw32-make.exe -j4 -f makefile.gcc %flags% %opts% %mod% %libtype%

注意命令行中还使用了 j4 四线程加速,整个编译过程就很快了,十分钟这样子就好了,而且没有使用上面提到的CXXFLAGS,也没出现内存不足问题,这是因为静态编译节省了大量额外的动态链接工作。Unicode版的静态链接库其实是适用性较高的一种选择,编译好的库已经打包上传到CSDN,后面附上下载地址。

新建wx工程时,在向导界面设置 wxWidgets Library Setting 时,去掉 Use wxWidgets DLL 选项,而选择 Monolithic Library 选项。这样,工程才会以上面列出的链接库来生产程序。

实操测试

测试中发现 Codeblock 10.05 + wxPack_v2.8.12 搭配运行是较稳定的,亦即 g++ 4.4.1 及 g++ 4.5.0 和 wxPack v2.8的组合较好。CodeBlocks 13.12 则和 wxMSM 3.0 搭配使用较好。尽管如此,通过下面的两组测试数据,发现 wxWidgets 的源代码移植问题应该是比较多的,工程质量可能会大受影响。

以下是一组搭配动态链接测试数据:

组合 g++ 4.4.1 g++ 4.6.2 g++ 4.7.1 g++ 4.8.1 g++ 4.9.2 g++ 5.1.0
wxMSW 3.0.2 1 1 OK 2 OK #i 3
wxMSW 3.0 8 7 OK #ii OK 3 3
wxPack2.8.12 OK OK 4 5 4 6

以下是一组搭配静态链接测试数据:

组合 g++ 4.4.1 g++ 4.6.2 g++ 4.7.1 g++ 4.8.1 g++ 4.9.2 g++ 5.1.0
wxPack 2.8.7 OK 10 11 5 11 6
wxPack2.8.12 10 OK i3 10 10 10 6 #10

#1 Error wxbase30u_gcc471TDM.dll 模块问题
#2 Error pthreadGC2.dll 模块的错误
#3 Error 编译错误过多
#4 Error wxbase28ud_gcc.dll模块异常;或 StackHash 模块错误。
#5 Error 正常编译,可以运行,但是进程为僵尸状态,不显示界面不提示错误。
#6 Error 编译错误,提示语法问题。
#7 Error wxbase30u_gcc481TDM.dll、wxbase30ud_gcc481TDM.dll 模块问题。
#8 Error wxbase30u_gcc481TDM.dll 或 程序自身模块问题不能运行,但编译通过无出错。
#9 Error 错误过多,基本是符号引用错误。
#10 Error 符号_Unwind_Resume引用问题,涉及异常处理,包含 libgcc_s.a 亦未解决。
#11 Error 程序自身模块问题不能运行,但编译通过无出错。
#i Info 使用 ISO C++ 2011 ,添加编译参数 -std=c++11 or -std=gnu++11。
#ii Info 编译通过,可以运行,但程序加载有明显延时。
#i3 Info 编译通过,按链接程序提示,添加了一系列系统库文件引用。但静态链接程序带调试文件巨大 30MB+,发行版则为可接受的2.38MB。

以上测试所得的数据可以为配置 Co

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值