CodeBlock速配wxWidgets
- Markdown 版起稿时间 2/1/2016 4:15:45 AM by Jimbowhy
- CSDN发布地址:http://blog.csdn.net/WinsenJiansbomber/article/details/50616754
- 本文更新版本:http://blog.csdn.net/winsenjiansbomber/article/details/50629635
使用软件版本:
- CodeBlocks 10.05 自带 mingw32-g++.exe (TDM-2 mingw32) 4.4.1
- CodeBlocks 12.13 自带 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 各个实测版本
- Windows 7 x64 on AMD CPU
动态编译
下载好各版本的 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时生成合集库文件,即 Monolithic Library,这也就是要求编译wx时必需指定MONOLITHIC=1,需要静态编译时要指定SHARED=0,这样才能进行静态链接的程序开发,例如:
mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=0 UNICODE=1 BUILD=debug
mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=0 UNICODE=1 BUILD=release
新建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 12.13 则和 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。
可能需要用到的系统库文件引用:
<Add library="libcomctl32.a" />
<Add libra