C ++: wxWidget HelloWorld - PullRequest
       7

C ++: wxWidget HelloWorld

2 голосов
/ 11 сентября 2009

При компиляции моего приложения wxWidget HelloWorld я получаю следующие ошибки:

Warning 1   warning LNK4098: defaultlib 'LIBCMTD' conflicts with use of other libs; use /NODEFAULTLIB:library   wxWidget__HelloWorld    wxWidget__HelloWorld
Error   2   error LNK2001: unresolved external symbol "public: virtual bool __thiscall wxApp::Initialize(int &,wchar_t * *)" (?Initialize@wxApp@@UAE_NAAHPAPA_W@Z)  minimal.obj wxWidget__HelloWorld
Error   3   error LNK2001: unresolved external symbol "public: virtual void __thiscall wxAppConsole::OnAssertFailure(wchar_t const *,int,wchar_t const *,wchar_t const *,wchar_t const *)" (?OnAssertFailure@wxAppConsole@@UAEXPB_WH000@Z)  minimal.obj wxWidget__HelloWorld
Error   4   error LNK2001: unresolved external symbol "public: virtual void __thiscall wxAppConsole::OnAssert(wchar_t const *,int,wchar_t const *,wchar_t const *)" (?OnAssert@wxAppConsole@@UAEXPB_WH00@Z) minimal.obj wxWidget__HelloWorld
Error   5   error LNK2019: unresolved external symbol "protected: void __thiscall wxStringBase::InitWith(wchar_t const *,unsigned int,unsigned int)" (?InitWith@wxStringBase@@IAEXPB_WII@Z) referenced in function "public: __thiscall wxStringBase::wxStringBase(wchar_t const *)" (??0wxStringBase@@QAE@PB_W@Z)   minimal.obj wxWidget__HelloWorld
Error   6   error LNK2019: unresolved external symbol "public: int __cdecl wxString::Printf(wchar_t const *,...)" (?Printf@wxString@@QAAHPB_WZZ) referenced in function "public: void __thiscall MyFrame::OnAbout(class wxCommandEvent &)" (?OnAbout@MyFrame@@QAEXAAVwxCommandEvent@@@Z)    minimal.obj wxWidget__HelloWorld
Error   7   error LNK2001: unresolved external symbol "wchar_t const * const wxEmptyString" (?wxEmptyString@@3PB_WB)    minimal.obj wxWidget__HelloWorld
Error   8   error LNK2001: unresolved external symbol "wchar_t const * const wxStatusLineNameStr" (?wxStatusLineNameStr@@3QB_WB)    minimal.obj wxWidget__HelloWorld
Error   9   error LNK2001: unresolved external symbol "wchar_t const * const wxFrameNameStr" (?wxFrameNameStr@@3QB_WB)  minimal.obj wxWidget__HelloWorld
Error   10  error LNK2019: unresolved external symbol "void __cdecl wxOnAssert(wchar_t const *,int,char const *,wchar_t const *,wchar_t const *)" (?wxOnAssert@@YAXPB_WHPBD00@Z) referenced in function "public: __thiscall wxStringBase::wxStringBase(class wxStringBase const &)" (??0wxStringBase@@QAE@ABV0@@Z)  minimal.obj wxWidget__HelloWorld
Error   11  fatal error LNK1120: 9 unresolved externals F:\C++\_2008_\wxWidget__HelloWorld\Debug\wxWidget__HelloWorld.exe   wxWidget__HelloWorld

Мой исходный код выглядит следующим образом:

//

Name:        minimal.cpp
// Purpose:     Minimal wxWidgets sample
// Author:      Julian Smart

#include "wx/wx.h"

// Declare the application class
class MyApp : public wxApp
{
public:
    // Called on application startup
    virtual bool OnInit();
};

// Declare our main frame class
class MyFrame : public wxFrame
{
public:
    // Constructor
    MyFrame(const wxString& title);

    // Event handlers
    void OnQuit(wxCommandEvent& event);
    void OnAbout(wxCommandEvent& event);

private:
    // This class handles events
    DECLARE_EVENT_TABLE()
};

// Implements MyApp& GetApp()
DECLARE_APP(MyApp)

// Give wxWidgets the means to create a MyApp object
IMPLEMENT_APP(MyApp)

// Initialize the application
bool MyApp::OnInit()
{
    // Create the main application window
    MyFrame *frame = new MyFrame(wxT("Minimal wxWidgets App"));

    // Show it
    frame->Show(true);

    // Start the event loop
    return true;
}

// Event table for MyFrame
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
    EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
    EVT_MENU(wxID_EXIT,  MyFrame::OnQuit)
END_EVENT_TABLE()

void MyFrame::OnAbout(wxCommandEvent& event)
{
    wxString msg;
    msg.Printf(wxT("Hello and welcome to %s"),
               wxVERSION_STRING);


    wxMessageBox(msg, wxT("About Minimal"),
                 wxOK | wxICON_INFORMATION, this);
}

void MyFrame::OnQuit(wxCommandEvent& event)
{
    // Destroy the frame
    Close();
}

#include "mondrian.xpm"

MyFrame::MyFrame(const wxString& title)
       : wxFrame(NULL, wxID_ANY, title)
{
    // Set the frame icon
    SetIcon(wxIcon(mondrian_xpm));

    // Create a menu bar
    wxMenu *fileMenu = new wxMenu;

    // The "About" item should be in the help menu
    wxMenu *helpMenu = new wxMenu;
    helpMenu->Append(wxID_ABOUT, wxT("&About...\tF1"),
                     wxT("Show about dialog"));

    fileMenu->Append(wxID_EXIT, wxT("E&xit\tAlt-X"),
                     wxT("Quit this program"));

    // Now append the freshly created menu to the menu bar...
    wxMenuBar *menuBar = new wxMenuBar();
    menuBar->Append(fileMenu, wxT("&File"));
    menuBar->Append(helpMenu, wxT("&Help"));

    // ... and attach this menu bar to the frame
    SetMenuBar(menuBar);

    // Create a status bar just for fun
    CreateStatusBar(2);
    SetStatusText(wxT("Welcome to wxWidgets!"));
}

Чего не хватает?

Ответы [ 2 ]

3 голосов
/ 11 сентября 2009

Убедитесь, что вы соответствуете настройке вашего проекта тому, что используют все ваши зависимости (на самом деле вы должны соответствовать зависимости:)).

Настройки, которые могут вызвать проблемы с линковкой с помощью MS toolchain (кроме очевидного отсутствия ссылок на библиотеки):

  • Использовать юникод / ​​многобайтовый набор символов
  • Рассматривайте wchar_t как встроенный тип.

Когда вы знаете , что чертовски неразрешенный-wchar_t * -contents-symbol находится в проклятой библиотеке, с которой вы только что соединились, это, вероятно, одна из этих двух.

  • Runtime (многопоточный [debug] [dll]).

Это причина вашего предупреждения LIBCMTD. И для отсутствующих / конфликтующих символов, таких как __free или malloc или других стандартных вещей. И по непонятным причинам не происходит сбоев при пересечении границ dll или даже в пустом месте, если вам как-то удается связать 2 разных времени выполнения в один двоичный файл (я видел это!).

  • Подозрительные определения препроцессора, такие как _LIB, _DLL, QT_DLL и т. Д.

Они используются некоторыми библиотеками, чтобы решить, должен ли код быть связан статически или динамически. Они обычно влияют на заголовки, которые сопровождают lib или dll. Вы должны знать, нужны ли они вам или нет. RTFM или посмотрите конфиги для рабочих примеров проектов для тех.

Итак, для вашей проблемы, сначала убедитесь, что вы добавили все библиотеки wxWidget, которые вам нужны (и любые зависимости, которые им нужны). Найдите любой из пропущенных символов и позвольте Google направить вас. У кого-то была бы такая же проблема, и он бы опубликовал это где-нибудь, прежде чем сам это выяснить.

Хороший поисковый запрос:

virtual bool __thiscall wxApp::Initialize

Особое внимание требуется для выполнения. Когда у вас есть все необходимые библиотеки, но вы получаете предупреждения или конфликты libcmt * или msvc *, затем просмотрите все настройки ваших проектов и убедитесь, что 4 элемента, которые я перечислил, являются правильными и согласованными. Вы должны знать их и для зависимостей, если вы сами их не строили. Используйте флаг компоновки многословия, чтобы точно определить, кто вносит нежелательную среду выполнения.

Другие настройки компилятора и компоновщика тоже могут повлиять на ситуацию, поэтому сделайте все возможное с помощью расчески.

Большинство этих изменений требуют чистой перекомпиляции.

Это удовольствие от создания кода на C ++.

2 голосов
/ 11 сентября 2009

Похоже, ошибка, которую вы получаете, когда связываете неверную библиотеку C Runtime. Когда вы собираете wxWidgets, он использует параметры многопоточной DLL и параметры многопоточной отладки DLL по умолчанию для выпуска и отладки соответственно.

Чтобы изменить это в своем приложении, вам нужно перейти:

Build-> Properties-> C / C ++ -> Generation Code, а затем измените параметр Runtime Library и перестройте приложение.

Если вы предпочитаете статически связываться с C Runtime Library, чтобы вам не нужна DLL, вы можете запустить find find снова все файлы vcproj в wxWighets \ build \ msw и заменить

RuntimeLibrary = "3" с RuntimeLibrary = "1" и

RuntimeLibrary = "2" с RuntimeLibrary = "0"

Однако это также изменит сборки DLL, и это может быть не то, что вам нужно.

...