VS编译wxWidgets

准备工作##

  • 下载wxWidgets源码包(官网),我用的是3.02版;
  • 安装Visual Studio。我用的是VS 2015 RC;

编译源码##

  1. 解压wxWidgets的源码包,会得到一大堆文件。进入build\msw文件夹,这个文件夹内是专门为Visual Studio提供的工程文件。在里面能找到从VC7到V12的工程文件。但VS 2015应该是VC14。不用在意这些细节,直接打开wx_vc12.sln,挑一个相对最新的。
  2. 打开之后VS会提示项目代码升级,直接确定。然后在解决方案资源管理器中选中所有项目,打开属性页。


    先编译一个Debug版本的,所以配置Debug字符集Unicode。这个选未设置也可以,但一定要保证你的wxWidgets工程的设置和编译源码的设置是一致的。
    编译过程中可能会出现“snprintf重定义”的错误:

fatal error C1189: #error: Macro definition of snprintf conflicts with Standard Library function declaration

这个博客给出了解决方案,即注释掉\src\tiff\libtiff\tif_config.h中的宏 snprintf 的定义:

//#define snprintf _snprintf

再次编译,没有错误。编译出的结果在\lib\vc_lib下。另外\build\msw\vc_mswud下是VS生成的日志文件,挺占空间的,可以删。

Hello World##

开始测试我们编译出的东西能不能用:

  1. 新建一个空白的C++工程。在它的项目属性页里添加一些东西:
    ·配置属性->VC++目录->常规->包含目录 加上
    X:\...\wxWidgets\include
    X:\...\wxWidgets\include\msvc
    ·配置属性->VC++目录->常规->库目录 加上
    X:\...\wxWidgets\lib\vc_lib
    ·配置属性->链接器->输入->附加依赖项 加上
    wxbase30ud.lib wxmsw30ud_core.lib wxmsw30ud_gl.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib oleacc.lib
    这一部分的依赖项并不是固定的,按需求来添加。wxbase30ud.lib其中的30表示版本。

  2. 添加一个空白cpp文件,贴上一段从官网上找到的Hello World代码。

  3. 运行结果图

// wxWidgets "Hello world" Program
// For compilers that support precompilation, includes "wx/wx.h".
#include <wx/wxprec.h>
#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif
class MyApp : public wxApp
{
public:
	virtual bool OnInit();
};
class MyFrame : public wxFrame
{
public:
	MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
private:
	void OnHello(wxCommandEvent& event);
	void OnExit(wxCommandEvent& event);
	void OnAbout(wxCommandEvent& event);
	wxDECLARE_EVENT_TABLE();
};
enum
{
	ID_Hello = 1
};
wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(ID_Hello, MyFrame::OnHello)
EVT_MENU(wxID_EXIT, MyFrame::OnExit)
EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
wxEND_EVENT_TABLE()
wxIMPLEMENT_APP(MyApp);
bool MyApp::OnInit()
{
	MyFrame *frame = new MyFrame("Hello World", wxPoint(50, 50), wxSize(450, 340));
	frame->Show(true);
	return true;
}
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
	: wxFrame(NULL, wxID_ANY, title, pos, size)
{
	wxMenu *menuFile = new wxMenu;
	menuFile->Append(ID_Hello, "&Hello...\tCtrl-H",
		"Help string shown in status bar for this menu item");
	menuFile->AppendSeparator();
	menuFile->Append(wxID_EXIT);
	wxMenu *menuHelp = new wxMenu;
	menuHelp->Append(wxID_ABOUT);
	wxMenuBar *menuBar = new wxMenuBar;
	menuBar->Append(menuFile, "&File");
	menuBar->Append(menuHelp, "&Help");
	SetMenuBar(menuBar);
	CreateStatusBar();
	SetStatusText("Welcome to wxWidgets!");
}
void MyFrame::OnExit(wxCommandEvent& event)
{
	Close(true);
}
void MyFrame::OnAbout(wxCommandEvent& event)
{
	wxMessageBox("This is a wxWidgets' Hello world sample",
		"About Hello World", wxOK | wxICON_INFORMATION);
}
void MyFrame::OnHello(wxCommandEvent& event)
{
	wxLogMessage("Hello world from wxWidgets!");
}
posted @ 2015-07-15 10:44  tyusr  阅读(1553)  评论(0编辑  收藏  举报