C ++:wxWidget HelloWorld

时间:2009-09-11 04:51:36

标签: c++ wxwidgets

编译我的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 个答案:

答案 0 :(得分:3)

确保您将项目上的设置与所有依赖项所使用的设置相匹配(实际上您应该匹配依赖项:)。

可能导致与MS工具链的链接问题的设置(除了显然根本没有链接库):

  • 使用unicode / multibyte字符集
  • 将wchar_t视为内置类型。

当你知道该死的未解决的wchar_t * -containing-symbol就在你刚刚联系到的该死的库中时,这可能就是其中之一。

  • 运行时(多线程/单线程[debug] [dll])。

这是您的LIBCMTD警告的原因。对于像__free或malloc或其他标准外观的缺失/冲突符号。而且,如果你以某种方式设法将2个不同的运行时连接成一个二进制文件(我已经看过它了!),那么在穿越dll边界时,甚至在空地上都会毫无理由地崩溃。

  • 怀疑预处理程序定义,如_LIB,_DLL,QT_DLL等。

某些库使用它们来确定代码是应该静态链接还是动态链接。它们通常会影响lib或dll附带的标头。你必须知道你是否需要它们。 RTFM或查看那些工作示例项目的配置。

因此,对于您的问题,首先要确保添加必须的wxWidget库(以及它们需要的任何依赖项)。搜索任何缺失的符号,并让谷歌指导您。有人会遇到同样的问题,并且会先把它贴在某处,然后自己搞清楚。

一个好的搜索词是

virtual bool __thiscall wxApp::Initialize

运行时需要特别小心。如果你得到了所需的所有库,但是你得到了libcmt *或msvc *警告或冲突,那么请查看所有项目设置并检查我列出的4项是否正确且一致。如果你没有自己构建它们,你必须知道它们的依赖性。使用链接器详细程度标志也可以确切地看到谁引入了不需要的运行时。

其他编译器和链接器设置也可能会影响它们,所以请仔细梳理它们。

大多数更改都需要干净的重新编译。

这是构建C ++代码的乐趣。

答案 1 :(得分:2)

在我看来,当你链接错误的C运行时库时,你会得到错误。当您构建wxWidgets时,它默认使用多线程DLL选项和多线程调试DLL选项分别用于Release和Debug构建。

要在您的应用中进行更改,您需要:

构建 - >属性 - > C / C ++ - >代码生成,然后更改运行时库选项并重建您的应用。

如果您希望静态链接C运行时库,这样您就不需要DLL了,您可以再次运行查找替换wxWighets \ build \ msw中的所有vcproj文件并替换

RuntimeLibrary =“3”,RuntimeLibrary =“1” 和

RuntimeLibrary =“2”,RuntimeLibrary =“0”

这也将改变DLL构建,但这可能不是你想要的。