Code Knight

Programming is so cool
随笔 - 52, 文章 - 0, 评论 - 14, 引用 - 0
数据加载中……

VS05编译wxWidgets

找了好多文章照着做弄了一下午才弄好,自己归总一下,wxWidgets版本2.8.9。

导读:
  1. 去http://www.wxwidgets.org/downloads/下载一个wxMSW版本的wxWidgets。
  2. 运行安装文件。在安装好后设置环境变量WXWIN,指向wxWidgets的安装目录。因为安装过程仅仅是把文件拷贝到指定的目录,所以还需要对wxWidgets进行编译。
  3. 进入$(WXWIN)\build\msw目录,用VS2005打开wx.dsw,提示是否进行项目转换,点确定。如果想要连接静态运行库,在编译前应该对每个项目进行设置。
  
   
         编译Debug版本的库:用Visual Studio 2005打开build\msw\wx.dsw文件,Solution Configurations中选中Unicode Debug,直接Build Solution就可以编译出Debug版本的wxWidgets库了。(默认的是Multi-Threaded debug dll)
    编译Relase版本的库:Release 版本的wxWidgets库虽然也可以通过类似的方法去编译,但编译出来的库仍然依赖于visual studio 2005的运行时库。Debug版本的库依赖VS2005也就算了,反正是自己调试用的。Release版本可是要给别人用的,再带上一大堆dll就不好了。为了解决这个问题,我们需要先在Solution Configuration中选中Unicode Release,然后在Solution Explorer中,针对每一个project在项目属性的C/C++ --> Code Generation --> Runtime Library中选Multi-Threaded。(HOHO, 有20个项目要改属性啊~~~)。最后再Build Solution就可以了。(也就是LIB库)

  
  编译好后的wxWidgets会在$(WXWIN)\lib\vc_lib目录下生成一系列的lib文件,这些lib文件的名字遵循下面的命名规则:不依赖于GUI组件的库会以"wxbase"开头,紧跟着的是版本号,然后的字母表明这个库是否是编译为Unicode('u')或是否是编译为Debug('d'),名字中的最后部分是wxWidgets组件的名字。
  注意:wxWidgets编译完后在$(WXWIN)\build\msw目录下会生成许多预编译头文件,占了很大的空间,如果确定以后不再编译wxWidgets库的话,可以考虑删掉。
  设置VC开发环境
  打开Tools -> Options -> Projects and Solutions -> VC++ Directories
  1. 在Include files中加入$(WXWIN)\include和$(WXWIN)\include\msvc
  2. 在Library files中加入$(WXWIN)\lib\vc_lib
  创建wxWidgets项目
  新建一个General -> Empty Project或Win32 -> Win32 Project项目,然后设置项目的一些属性,可以选择下面的其中一个来设置。譬如你如果打算使用Unicode,那么选择Unicode Debug或Unicode Release,如果你仅仅想调试程序而非发布,则只需要选择Debug设置。
  Debug:
  Project Properties -> General -> Character Set: No Set
  Project Properties -> C/C++ -> Code Generation -> Runtime Library: Multi-threaded Debug DLL (/MDd)
  Project Properties -> Linker -> Input -> Additional Dependencies: wxbase28d.lib wxmsw28d_core.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib oleacc.lib

  Release:
  Project Properties -> General -> Character Set: No Set
  Project Properties -> C/C++ -> Code Generation -> Runtime Library: Multi-threaded (/MT)
  Project Properties -> Linker -> Input -> Additional Dependencies: wxbase28.lib wxmsw28_core.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib oleacc.lib

  Unicode Debug:
  Project Properties -> General -> Character Set: Use Unicode Character Set
  Project Properties -> C/C++ -> Code Generation -> Runtime Library: Multi-threaded Debug DLL (/MDd)
  Project Properties -> Linker -> Input -> Additional Dependencies: wxbase28ud.lib wxmsw28ud_core.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib oleacc.lib

  Unicode Release:
  Project Properties -> General -> Character Set: Use Unicode Character Set
  Project Properties -> C/C++ -> Code Generation -> Runtime Library: Multi-threaded (/MT)
  Project Properties -> Linker -> Input -> Additional Dependencies: wxbase28u.lib wxmsw28u_core.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib oleacc.lib

  问题
  1. 在编译时出现了Cannot open include file: '../mswu/wx/setup.h': No such file or directory错误
  这是因为项目属性的Character Set设置不正确,必须与使用的wxWidgets库的Character Set一致。
  2. 在编译时出现了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不相同。
  3. 运行是出现No Debugging Information对话框
  将Project Properties -> Linker -> Debugging -> Generate Debug Info的值改成Yes (/DEBUG)。
#ifndef WXWIDGETS_EXAMPLE_HELLOWORLDAPP_H_20080722
#define WXWIDGETS_EXAMPLE_HELLOWORLDAPP_H_20080722

//对于支持预编译的编译器,包含此文件
// For compilers that support precompilation, includes "wx.h".
#include <wx/wxprec.h>

//对于不支持预编译的编译器,进行如下操作
#ifndef WX_PRECOMP
// Include your minimal set of headers here, or wx.h
#include <wx/wx.h>
#endif

//定义wxApp类
class HelloWorldApp : public wxApp
{
public :
    
//在程序初始化时调用
    virtual bool OnInit();
    
//在程序结束时调用
    virtual int OnExit();
};

//定义wxGetApp()函数,可以取得HelloWorldApp类型的全局程序变量
DECLARE_APP(HelloWorldApp)

#endif //WXWIDGETS_EXAMPLE_HELLOWORLDAPP_H_20080722


#ifndef WXWIDGETS_EXAMPLE_HELLOWORLDAPP_H_20080722
#define WXWIDGETS_EXAMPLE_HELLOWORLDAPP_H_20080722

//对于支持预编译的编译器,包含此文件
// For compilers that support precompilation, includes "wx.h".
#include <wx/wxprec.h>

//对于不支持预编译的编译器,进行如下操作
#ifndef WX_PRECOMP
// Include your minimal set of headers here, or wx.h
#include <wx/wx.h>
#endif

//定义wxApp类
class HelloWorldApp : public wxApp
{
public :
    
//在程序初始化时调用
    virtual bool OnInit();
    
//在程序结束时调用
    virtual int OnExit();
};

//定义wxGetApp()函数,可以取得HelloWorldApp类型的全局程序变量
DECLARE_APP(HelloWorldApp)

#endif //WXWIDGETS_EXAMPLE_HELLOWORLDAPP_H_20080722


posted on 2009-02-16 22:59 Code Knight 阅读(2965) 评论(0)  编辑 收藏 引用 所属分类: GUI编译记


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理