Pregunta

Al compilar mi aplicación wxWidget HelloWorld, obtengo los siguientes errores:

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

Mi código fuente es el siguiente:

//

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

¿Qué falta?

¿Fue útil?

Solución

Asegúrese de que la configuración de su proyecto coincida con la que están usando todas sus dependencias (en realidad, debe coincidir con las dependencias :)).

La configuración que puede causar problemas de vinculación con MS toolchain (además de obvio que no vincula las bibliotecas en absoluto):

  • Utilice el conjunto de caracteres Unicode / Multibyte
  • Trate wchar_t como tipo incorporado.

Cuando sabes que el maldito no resuelto-wchar_t * -containing-symbol está en la maldita biblioteca a la que acabas de enlazar, este es probablemente uno de esos dos.

  • Tiempo de ejecución (múltiples / single threaded [debug] [dll]).

Este es el motivo de su advertencia LIBCMTD. Y para símbolos faltantes / en conflicto como __free o malloc u otras cosas de apariencia estándar. Y por razones misteriosas, no hay razón para bloquearse al cruzar los límites de dll, o incluso en un lugar vacío si de alguna manera logras vincular 2 tiempos de ejecución diferentes en un binario (¡lo he visto!).

  • Sospeche las definiciones de preprocesador como _LIB, _DLL, QT_DLL, etc.

Algunas bibliotecas utilizan estos para decidir si el código debe estar vinculado de forma estática o dinámica. Por lo general afectan a los encabezados que acompañan a lib o dll. Tienes que saber si los necesitas o no. RTFM o vea configuraciones para trabajar con proyectos de ejemplo para esos.

Entonces, para su problema, primero asegúrese de agregar las bibliotecas wxWidget que debe (y las dependencias que necesiten). Busca cualquiera de los símbolos que faltan y deja que Google te guíe. Alguien tendría el mismo problema y lo habría publicado en algún lugar antes de resolverlo por sí mismos.

Un buen término de búsqueda es

virtual bool __thiscall wxApp::Initialize

Se necesita atención especial para el tiempo de ejecución. Cuando tienes todas las librerías que necesitas, pero obtienes advertencias o conflictos con libcmt * o msvc *, repasas todas las configuraciones de tus proyectos y verificas que los 4 elementos que enumeré sean correctos y consistentes. También debes conocerlos para las dependencias, si no los construiste tú mismo. Use la bandera de verbosidad del enlazador para ver exactamente quién trae el tiempo de ejecución no deseado.

Otras configuraciones del compilador y del enlazador también pueden afectar las cosas, así que ve con un buen peine a través de todas ellas.

La mayoría de esos cambios requieren una recompilación limpia.

Esta es la diversión de crear código C ++.

Otros consejos

Me parece el error que se produce al vincular la biblioteca en tiempo de ejecución de C incorrecta. Cuando compila wxWidgets, utiliza la opción DLL de subprocesos múltiples y las opciones de depuración de DLL de subprocesos múltiples de forma predeterminada para la compilación de lanzamiento y depuración respectivamente.

Para cambiar esto en tu aplicación, debes ir:

Construir - > Propiedades- > C / C ++ - > Generación de código y luego cambiar la opción de la biblioteca de Runtime y reconstruir tu aplicación.

Si prefiere vincular estáticamente con la Biblioteca en tiempo de ejecución de C para que no necesite la DLL, podría ejecutar una búsqueda y reemplazar nuevamente todos los archivos vcproj en wxWighets \ build \ msw y reemplazar

RuntimeLibrary = " 3 " con RuntimeLibrary = " 1 " y

RuntimeLibrary = " 2 " con RuntimeLibrary = " 0 "

Sin embargo, esto también cambiará las compilaciones de DLL y puede que esto no sea lo que quieres.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top