当我尝试从MS Visual Studio 2017 Community Edition中的wxWidgets编译hello world应用程序时,出现大量错误。我认为关键错误是#error: "wchar_t must be available"
。据我看,只有一个人发现了此错误,当他们询问时,他们没有得到任何有用的答案。 [http://www.cplusplus.com/forum/windows/197245/]
如何使该程序成功编译,以及如何确保在以后的(真实)项目中不会出现相同的错误?
我刚刚开始学习wxWidgets,并且在笔记本电脑上安装了3.0.4版。我下载了安装程序,然后按照说明使用Visual Studio来编译库。我相信,由于所有示例项目都已编译并成功运行,因此安装成功完成。但是,当我尝试在自己的项目中编译提供的hello world应用程序时,出现了上述错误。我确保已链接wxWidgets标头,尽管由于我不熟悉使用非内置库,所以可能会犯一个错误。我不确定为什么hello world无法使用示例项目。
// 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();
private:
void OnHello(wxCommandEvent& event);
void OnExit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
};
enum
{
ID_Hello = 1
};
wxIMPLEMENT_APP(MyApp);
bool MyApp::OnInit()
{
MyFrame *frame = new MyFrame();
frame->Show(true);
return true;
}
MyFrame::MyFrame()
: wxFrame(NULL, wxID_ANY, "Hello World")
{
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!");
Bind(wxEVT_MENU, &MyFrame::OnHello, this, ID_Hello);
Bind(wxEVT_MENU, &MyFrame::OnAbout, this, wxID_ABOUT);
Bind(wxEVT_MENU, &MyFrame::OnExit, this, wxID_EXIT);
}
void MyFrame::OnExit(wxCommandEvent& event)
{
Close(true);
}
void MyFrame::OnAbout(wxCommandEvent& event)
{
wxMessageBox("This is a wxWidgets Hello World example",
"About Hello World", wxOK | wxICON_INFORMATION);
}
void MyFrame::OnHello(wxCommandEvent& event)
{
wxLogMessage("Hello world from wxWidgets!");
}
这是https://docs.wxwidgets.org/trunk/overview_helloworld.html上可用代码的精确副本。 如果网站上的代码已更新,我将在此处包括代码。
您可以想象,我希望程序能够正常编译并运行,但是相反,我遇到了大量错误,所有错误均在此图中列出: https://media.discordapp.net/attachments/452995181667418119/527236184326275113/unknown.png
这是我做的一些有趣的观察:
大多数错误源于编译器无法找到类wxFrame的定义
wxApp类仍在定义,我可以从中继承myApp类。
chartype.h
给出了一个错误,即wchar_t必须可用,即使根据http://www.cplusplus.com/reference/cwchar/wchar_t/它是c ++内置的,我也不需要包含任何其他标头。
chartype.h
中的错误在以下代码片段中找到:
/* Unicode support requires wchar_t */
#if !wxUSE_WCHAR_T
#error "wchar_t must be available"
#endif /* Unicode */
感谢您的帮助。
答案 0 :(得分:0)
经过一些搜索,我发现wxWidgets没有定义wxUSE_WCHAR_T,但是确实定义了SIZEOF_WCHAR_T。对我来说似乎很奇怪。 但是,经过更多搜索后,我发现此页面: https://wiki.wxwidgets.org/Microsoft_Visual_C%2B%2B_Guide
从这里看来重要的是: 预处理程序定义:
这也使我想起来我很愚蠢,因为在某个时间点上,我阅读了有关Windows Api的入门教程,并且说如果您打算使用UNICODE,它肯定会定义UNICODE。
#define UNICODE // Controls the windows library definitions
#define _UNICODE // Controls the C library definitions
我不确定100%,但是我怀疑这就是问题所在。
答案 1 :(得分:0)
您如何编译hello world示例?您的图片显示了E0020
和E0070
之类的错误,它们不是标准的MSVC编译器错误 at all (这些错误的格式为Cnnnn
)。您需要创建一个新的“ Win32应用程序”项目并按照the documentation中的说明更改设置(使用MSVC时,最后一段适用于您的情况)。
或者,下载更新的v3.1.2,然后从您的项目中以explained here引用新的wxwidgets.props
文件。