WxWidgets Hello World не может скомпилировать: «wchar_t должен быть доступен» - PullRequest
0 голосов
/ 26 декабря 2018

Когда я пытаюсь скомпилировать приложение hello world из wxWidgets в MS Visual Studio 2017 Community Edition, я получаю большое количество ошибок.Я считаю, что ключевая ошибка - #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 */
  • Насколько я могу судить, #define фактически никогда не устанавливается ни в каких исходных файлах, которые я могу найти, но он показывает, существует ли тип wchar_t.Я добавил небольшую переменную в свой код этого типа, и она была создана отлично

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Как вы собираете пример "Привет, мир?"Ваше изображение показывает ошибки, такие как E0020 и E0070, которые не являются стандартными ошибками компилятора MSVC при все (они будут иметь форму Cnnnn).Вам необходимо создать новый проект «Приложение Win32» и изменить настройки, как описано в документации (поскольку вы используете MSVC, последний параграф относится к вашему случаю).

В качестве альтернативы,загрузите более новую версию 3.1.2 и просто укажите новый файл wxwidgets.props из своего проекта, как описано здесь .

0 голосов
/ 26 декабря 2018

После некоторых поисков я обнаружил, что 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%, но подозреваю, что это будет проблемой.

...