【问题标题】:WxWidgets Hello World fails to compile: "wchar_t must be available"WxWidgets Hello World 编译失败:“wchar_t 必须可用”
【发布时间】:2018-12-25 21:46:54
【问题描述】:

当我尝试在 MS Visual Studio 2017 社区版中从 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中的错误在这段代码sn-p中找到:


/* Unicode support requires wchar_t */
#if !wxUSE_WCHAR_T
    #error "wchar_t must be available"
#endif /* Unicode */
  • 据我所知,#define 从未在我能找到的任何源文件中实际设置,但它表示 wchar_t 类型是否存在。我在这种类型的代码中添加了一个小变量,它创建得很好

感谢任何帮助。

【问题讨论】:

  • 该错误 (C1189) 是由预处理器定义引起的。您能否查看有问题的文件“chartype.h”以了解其原因(IDE 应帮助为正确的预处理器定义着色)
  • @UnholySheep 错误出现在引用#define 的#if 中。据我所知,这个常数表示是否可以找到 wchar_t。 wxWidgets 库中对它的定义都没有实际使用,因为它们都在 #ifndef 块中找到,而且似乎已经定义,也许它是内置在 c++ 中的?
  • 查看source 这是使用自定义定义wxUSE_WCHAR_T,这绝对不是C++ 内置的。 某事必须将其设置为0,要么通过#define,要么可能在您的项目设置中定义
  • 我将目标更改为 x64,我得到了同样的错误,除了现在编译器“无法打开 wxprec.h”,即使文件存在
  • @HDSQ.mid,您说所有样本都已编译并运行良好。您能否打开最小工作区并查看它定义的内容以及它定义的项目属性。然后查看自己项目的属性。修正任何不一致的地方。构建并运行。享受。顺便说一句,建议将项目文件复制到新的地方,以便自己开始。从 3.1.1 开始有一个模板可以开始一个新项目。

标签: c++ wxwidgets


【解决方案1】:

您如何编译 hello world 示例?您的图像显示像 E0020E0070 这样的错误,它们不是标准的 MSVC 编译器错误at all(这些错误将是 Cnnnn 形式)。您需要创建一个新的“Win32 应用程序”项目并按照the documentation 中的说明更改设置(因为您使用的是 MSVC,最后一段适用于您的情况)。

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

【讨论】:

  • 我安装了 v3.1.2 并使用了 .props 文件,然后它完美运行!谢谢!
【解决方案2】:

经过一番搜索,我发现 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% 确定,但我怀疑这会是问题所在。

【讨论】:

  • 当我定义 _UNICODE 时,我收到关于重新定义声明的警告,因此它必须已经定义。与 UNICODE 相同
猜你喜欢
  • 2015-08-30
  • 2018-04-26
  • 1970-01-01
  • 2018-08-18
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
  • 2012-01-20
  • 1970-01-01
相关资源
最近更新 更多