문제

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 도구 체인의 문제를 일으킬 수있는 설정 (라이브러리를 전혀 연결하지 않는 것 외에도) :

  • 유니 코드/멀티 바이트 문자 세트를 사용하십시오
  • WCHAR_T를 내장 유형으로 취급하십시오.

때를 알다 그 해결되지 않은 wchar_t*-ctaining-symbol은 당신이 방금 연결 한 빌어 먹는 라이브러리에 있습니다. 이것은 아마도 그 두 가지 중 하나 일 것입니다.

  • 런타임 (멀티/단일 스레드 [디버그] [DLL]).

이것이 Libcmtd 경고의 이유입니다. 그리고 __free 또는 malloc 또는 기타 표준 모양의 것들과 같은 기호가 누락/충돌합니다. 그리고 신비한 이유는 DLL 경계를 건너면 사고가 없거나, 어떻게 든 2 개의 다른 런타임을 하나의 바이너리에 연결할 수 있다면 빈 장소에서도 충돌합니다 (나는 그것을 보았습니다!).

  • _lib, _dll, qt_dll 등과 같은 의심 전 처리기 정의.

이들은 일부 라이브러리에서 코드가 정적 또는 동적으로 연결되어야하는지 결정하는 데 사용됩니다. 일반적으로 lib 또는 dll에 동반되는 헤더에 영향을 미칩니다. 필요한지 아닌지 알아야합니다. RTFM 또는 작업 예제 프로젝트에 대한 구성을 확인하십시오.

따라서 문제의 경우 먼저 WXWIDGET 라이브러리를 추가해야합니다. 누락 된 기호를 검색하고 Google이 안내해 드리겠습니다. 누군가 같은 문제가 있었고 스스로 알아 내기 전에 어딘가에 게시했을 것입니다.

좋은 검색어는입니다

virtual bool __thiscall wxApp::Initialize

런타임에는 특별한주의가 필요합니다. 필요한 모든 Libs를 얻을 때 Libcmt* 또는 MSVC* 경고 또는 충돌을받은 다음 모든 프로젝트 설정을 거쳐 나열된 4 개의 항목이 정확하고 일관되어 있는지 확인하십시오. 직접 구축하지 않았다면 의존성에 대해서도 알아야합니다. Linker Verbosity 플래그를 사용하여 원치 않는 런타임을 가져 오는 사람을 정확하게보십시오.

다른 컴파일러 및 링커 설정도 사물에도 영향을 줄 수 있으므로 모두를 통해 미세한 빗으로 가십시오.

이러한 변경의 대부분은 깨끗한 재 컴파일이 필요합니다.

이것은 C ++ 코드를 구축하는 재미입니다.

다른 팁

잘못된 C 런타임 라이브러리를 연결할 때 얻는 오류를 좋아합니다. WXWIDGET을 구축하면 릴리스 및 디버그 빌드를 위해 기본적으로 멀티 스레드 DLL 옵션 및 다중 스레드 디버그 DLL 옵션을 사용합니다.

이것을 당신의 앱에서 변경하려면 다음을 수행해야합니다.

Build-> Properties-> C/C ++-> 코드 생성 후 런타임 라이브러리 옵션을 변경하고 앱을 재건하십시오.

C 런타임 라이브러리와 정적으로 링크를 선호하는 경우 DLL을 찾을 필요가 없으면 WXWighets Build MSW의 모든 vcproj 파일을 다시 교체 할 수 있습니다.

runtimelibrary = "3"runtimelibrary = "1"및

runtimelibrary = "2"with Runtimelibrary = "0"

그러나 이것은 DLL 빌드도 변경되며 이것이 원하는 것이 아닐 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top