编译wxWidgets
- http://www.wxwidgets.org/downloads/ 下载wxMSW版本的wxWidgets。下载后, 解压到 E:/wxWidgets-2.8.7
- 用vs2005 打开 E:/wxWidgets-2.8.7/build/msw/wx.dsw, 按提示进行转换.
- 我不想程序带一堆dll, 所以都设置成静态编译: (针对每个项目, 都要进行下面的 步骤)
选择wx里的一个项目, 在Project Properties -> C/C++ -> Code Generation中
将Runtime Library改成Multi-threaded Debug (/MTd) // Unicode Debug ,Debug版本
将Runtime Library改成Multi-Threaded (/MT) //Unicode Release, Release版本 - 编译Debug版本的库:Solution Configurations中选中Unicode Debug,然后 Build Solution就可以编译出unicode Debug版本的wxWidgets库了.
- Solution Configurations中选中Unicode Release,Build Solution就可以编译出unicode Release版本.
注意:wxWidgets编译完后在$(WXWIN)/build/msw目录下会生成许多预编译头文件,占了很大的空间,如果确定以后不再编译wxWidgets库的话,可以考虑删掉。
设置VS开发环境
- 打开Tools -> Options -> Projects and Solutions -> VC++ Directories
- 在Include files中加入e:/wxWidgets-2.8.0/include 和 e:/wxWidgets-2.8.0/include/msvc
- 在Library files中加入e:/wxWidgets-2.8.0/lib/vc_lib , e:/wxWidgets-2.8.0/lib/vc_lib/vc_mswud , e:/wxWidgets-2.8.0/lib/vc_lib/vc_mswu
创建基于wxWidgets的项目
- vs2005 -> 新建项目 -> win32项目 -> windows应用程序.
- 删除项目全部文件.
- 新建 .cpp .h , 在里面写入wxWidgets的代码.
- 用code::blocks 可以比较方便的设计窗口界面, 可先用C::B设计好界面.然后把 代码 copy 到vs. ( C::B虽然也不错, 但没有vs习惯. 至少vs 可以发现程序内存泄漏..这也是我写这个文档的原因)
我是这么作的.具体操作不太记得了. 现在新见项目都是直接 copy 第一个项目的文件夹, 然后在vs 里修改项目/解决方案名称. 省的老是设置项目配置.
基于wxWidgets的项目的配置:
打开项目属性
- Debug版本的配置:
C/C++ --> Code Generation --> Runtime Library 选 多线程调试(/MTd)
Linker --> Input --> Additional Dependencies写入:
wxbase28ud.lib
wxmsw28ud_core.lib
wxmsw28ud_adv.lib
wxmsw28ud_richtext.lib
winmm.lib
comctl32.lib
rpcrt4.lib
wsock32.lib
oleacc.lib
注意要选中 "从父级或项目默认设置继承(&I)" 选择框. - Release版本的配置:
C/C++ --> Code Generation --> Runtime Library 选 多线程(/MT)
Linker --> Input --> Additional Dependencies写入:
wxbase28u.lib
wxmsw28u_core.lib
wxmsw28u_adv.lib
wxmsw28u_richtext.lib
winmm.lib
comctl32.lib
rpcrt4.lib
wsock32.lib
oleacc.lib
注意要选中 "从父级或项目默认设置继承(&I)" 选择框.
注意这里我只添加了需要的lib, 如果程序用到其他功能, 那么需要加入其他lib. 比较完整的列表可参考: wxmsw28ud_core.lib wxbase28ud.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib, 或者 wxmsw28u_core.lib wxbase28u.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib
问题
- 在编译时出现了Cannot open include file: '../mswu/wx/setup.h': No such file or directory错误..
这是因为项目属性的Character Set设置不正确,必须与使用的wxWidgets库的Character Set一致。 - 在编译时出现了MSVCRT.lib(MSVCRT.dll) : error LNK2005: _free already defined in LIBC.lib(free.obj)
这是因为没有连接正确的wxWidgets库,譬如Unicode Debug版本的项目就需要连接Unicode+Debug版本的wxWidgets库(库名后缀为'ud'的lib文件)。或者是wxWidgets和Application使用的Runtime Library不相同。比如, Linker --> Input --> Additional Dependencies 写的是 wxbase28u.lib ,那么项目必须也是 unicode 的; 写的是 wxbase28ud.lib 那么项目必须也是 unicode debug 的 - 运行是出现No Debugging Information对话框
将Project Properties -> Linker -> Debugging -> Generate Debug Info的值改成Yes (/DEBUG)。 - link 的时候, 提示无法 link wxGenericFontDialog 等符号.
因为wxXXX.core.lib 里没有这个类! 默认的 wx.dsw 是把 core 项目里的若干cpp 排除在编译列表的. 在 解决方案资源管理器 里可以看到 这几个文件的图标 带有红色标记. 解决方法: 右键单击文件-> 属性->排除在编译列表 = 否 .然后重新编译. - 编译时出现无法找到__imp_MessageBoxW 等.
因为.....没有链接 windows 的基本lib ...参见项目属性设置. 注意要选中 "从父级或项目默认设置继承(&I)" 选择框.