문제
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 빌드도 변경되며 이것이 원하는 것이 아닐 수도 있습니다.