WxWidgets Hello World 编译失败:"wchar_t must be available"
WxWidgets Hello World fails to compile: "wchar_t must be available"
当我尝试在 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 headers,尽管由于我是使用 non-built-in 库的新手,所以我可能犯了一个错误。我不确定为什么示例项目可以工作,而 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
以下是我的一些有趣观察:
大部分错误源于编译器无法找到 class wxFrame
的定义
class wxApp 仍然定义,我可以从它继承 class myApp。
chartype.h
给出了 wchar_t 必须可用的错误,即使根据 http://www.cplusplus.com/reference/cwchar/wchar_t/ 它是 built-in 到 c++ 而我不知道不需要包含任何其他 headers.
chartype.h
中的错误是在这段代码中发现的:
/* Unicode support requires wchar_t */
#if !wxUSE_WCHAR_T
#error "wchar_t must be available"
#endif /* Unicode */
- 据我所知,#define 实际上从未在我能找到的任何源文件中设置,但它表示 wchar_t 类型是否存在。我在这种类型的代码中添加了一个小变量,它创建得很好
感谢任何帮助。
经过一些搜索,我发现 wxWidgets 没有定义 wxUSE_WCHAR_T,但它确实定义了 SIZEOF_WCHAR_T。我觉得很奇怪。
但是,经过更多搜索后,我找到了这个页面:
https://wiki.wxwidgets.org/Microsoft_Visual_C%2B%2B_Guide
从这里看来重要的是:
预处理器定义:
- _UNICODE - 如果您使用的是 Unicode,请添加此项(请注意,此定义可能继承自项目默认值 - 请参阅下面的注释)
这也让我想起了我是多么愚蠢,因为在某个时候我读了一篇关于 Windows Api 的介绍性教程,它明确地说如果你打算使用它,请定义 UNICODE。
#define UNICODE // Controls the windows library definitions
#define _UNICODE // Controls the C library definitions
我不是 100% 确定,但我怀疑这就是问题所在。
您如何编译 hello world 示例?您的图像显示 E0020
和 E0070
之类的错误,这些错误不是标准的 MSVC 编译器错误 at all (那些是Cnnnn
形式)。您需要创建一个新的 "Win32 application" 项目并按照 the documentation 中的说明更改设置(因为您使用的是 MSVC,最后一段适用于您的情况)。
或者,下载更新的 v3.1.2 并从您的项目中引用新的 wxwidgets.props
文件作为 explained here。
当我尝试在 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 headers,尽管由于我是使用 non-built-in 库的新手,所以我可能犯了一个错误。我不确定为什么示例项目可以工作,而 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
以下是我的一些有趣观察:
大部分错误源于编译器无法找到 class wxFrame
的定义
class wxApp 仍然定义,我可以从它继承 class myApp。
chartype.h
给出了 wchar_t 必须可用的错误,即使根据 http://www.cplusplus.com/reference/cwchar/wchar_t/ 它是 built-in 到 c++ 而我不知道不需要包含任何其他 headers.chartype.h
中的错误是在这段代码中发现的:
/* Unicode support requires wchar_t */
#if !wxUSE_WCHAR_T
#error "wchar_t must be available"
#endif /* Unicode */
- 据我所知,#define 实际上从未在我能找到的任何源文件中设置,但它表示 wchar_t 类型是否存在。我在这种类型的代码中添加了一个小变量,它创建得很好
感谢任何帮助。
经过一些搜索,我发现 wxWidgets 没有定义 wxUSE_WCHAR_T,但它确实定义了 SIZEOF_WCHAR_T。我觉得很奇怪。 但是,经过更多搜索后,我找到了这个页面: https://wiki.wxwidgets.org/Microsoft_Visual_C%2B%2B_Guide
从这里看来重要的是: 预处理器定义:
- _UNICODE - 如果您使用的是 Unicode,请添加此项(请注意,此定义可能继承自项目默认值 - 请参阅下面的注释)
这也让我想起了我是多么愚蠢,因为在某个时候我读了一篇关于 Windows Api 的介绍性教程,它明确地说如果你打算使用它,请定义 UNICODE。
#define UNICODE // Controls the windows library definitions
#define _UNICODE // Controls the C library definitions
我不是 100% 确定,但我怀疑这就是问题所在。
您如何编译 hello world 示例?您的图像显示 E0020
和 E0070
之类的错误,这些错误不是标准的 MSVC 编译器错误 at all (那些是Cnnnn
形式)。您需要创建一个新的 "Win32 application" 项目并按照 the documentation 中的说明更改设置(因为您使用的是 MSVC,最后一段适用于您的情况)。
或者,下载更新的 v3.1.2 并从您的项目中引用新的 wxwidgets.props
文件作为 explained here。