Вопрос

При компиляции моего приложения 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!"));
}

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

Это было полезно?

Решение

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

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

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

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

  • Среда выполнения (многопоточная /однопоточная [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 ++.

Другие советы

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

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

Сборка-> Свойства-> C / C ++-> Генерация кода, а затем измените параметр библиотеки времени выполнения и перестройте свое приложение.

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

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

RuntimeLibrary="2" с RuntimeLibrary="0"

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top