CodeBlock速配wxWidgets[U版]
- MD版起稿时间:2/1/2016 4:15:45 AM by Jimbowhy
- CSDN发布地址:http://blog.csdn.net/WinsenJiansbomber/article/details/50616754
- 线上发布时间:2/1/2016 5:58:33 AM
使用软件版本:
- 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