Pergunta

Ao compilar minha aplicação wxWidget HelloWorld, eu estou recebendo os seguintes erros:

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

Meu código fonte é a seguinte:

//

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!"));
}

O que está faltando?

Foi útil?

Solução

Certifique-se de você combinar configuração de seu projeto para que todas as suas dependências estão usando (na verdade, você deve coincidir com dependências:)).

Configurações que podem causar problemas de ligação com MS toolchain (além óbvio não ligando as bibliotecas em tudo):

  • set Uso de caracteres Unicode / multibyte
  • wchar_t Tratar como built-in tipo.

Quando você sei essa maldita não resolvido-wchar_t * contendo-símbolo é na biblioteca maldita que você ligou para, este é provavelmente um desses dois.

  • de tempo de execução (multi / roscado único [depuração] [dll]).

Esta é a razão para o seu aviso LIBCMTD. E para a falta / conflitantes símbolos como __free ou malloc ou outras coisas normais olhando. E para misteriosa nenhuma razão falha quando cruzar dll limites, ou mesmo no lugar vazio se você de alguma forma conseguem link de 2 tempos de execução diferentes em um binário (eu vi isso!).

  • definições de pré-processamento suspeito como _lib, _DLL, QT_DLL, etc.

Aqueles são usados ??por algumas bibliotecas para decidir se o código deveria ser vinculadas estaticamente ou dinamicamente. Eles geralmente afetam os cabeçalhos que acompanham um lib ou dll. Você tem que saber se você precisa deles ou não. RTFM ou olhada configurações para trabalhar projetos de exemplo para aqueles.

Assim, para o seu problema, primeiro certifique-se de adicionar o que wxWidget bibliotecas você deve (e tudo o que eles dependências precisa). Procurar qualquer um dos símbolos perdidos e deixar que o Google guiá-lo. Alguém teria mesmo problema e teria postado isso em algum lugar antes de descobrir isso eles mesmos.

Um termo boa pesquisa é

virtual bool __thiscall wxApp::Initialize
é necessário

Um cuidado especial para tempo de execução. Quando você tem todas as libs que você precisa, mas você começa * LIBCMT ou MSVC * avisos ou conflitos seguida, passar por todas as suas configurações de projetos e verificar que 4 itens I listados são correto e consistente. Você tem que conhecê-los para dependências também, se você não construir-los sozinho. bandeira Use vinculador verbosidade também ver exatamente quem traz em tempo de execução indesejada.

Outras configurações do compilador e vinculador pode afetar as coisas também, para ir com um pente fino através de todos eles.

A maioria dessas mudanças exigem recompilação limpo.

Esta é a diversão de construir código C ++.

Outras dicas

Parece-me que o erro que você começa quando você ligá-lo errado Runtime Library C. Quando você constrói wxWidgets ele usa a opção DLL multi-threaded e multi-threaded opções de depuração DLL por padrão para lançamento e compilação de depuração, respectivamente.

Para alterar esta em você app você precisa ir:

Build-> Propriedades> C / C ++ -.> Geração de código e, em seguida, alterar a opção Runtime Library e reconstruir seu aplicativo

Se você preferir estaticamente ligação contra o Runtime Library C, assim você não precisa DLL você pode executar um achado substituir novamente todos os arquivos vcproj em wxWighets \ build \ msw e substituir

RuntimeLibrary = "3" com RuntimeLibrary = "1" e

RuntimeLibrary = "2" com RuntimeLibrary = "0"

Isso vai mudar DLL constrói bem no entanto e este não pode ser o que quiser.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top