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

以下是我的一些有趣观察:


/* Unicode support requires wchar_t */
#if !wxUSE_WCHAR_T
    #error "wchar_t must be available"
#endif /* Unicode */

感谢任何帮助。

经过一些搜索,我发现 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 示例?您的图像显示 E0020E0070 之类的错误,这些错误不是标准的 MSVC 编译器错误 at all (那些是Cnnnn 形式)。您需要创建一个新的 "Win32 application" 项目并按照 the documentation 中的说明更改设置(因为您使用的是 MSVC,最后一段适用于您的情况)。

或者,下载更新的 v3.1.2 并从您的项目中引用新的 wxwidgets.props 文件作为 explained here