When compiling my wxWidget HelloWorld application, I am getting the following errors:
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
My source code is as follows:
//
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!"));
}
What is missing?
Make sure you match setting on your project to what all your dependencies are using (actually you should match dependencies :)).
Settings that can cause linking problems with MS toolchain (besides obvious not linking the libraries at all):
Use unicode/multibyte character set
Treat wchar_t as built-in type.
When you know that damn unresolved-wchar_t*-containing-symbol is in the damn library you just linked into, this is probably one of those two.
Runtime (multi/single threaded [debug] [dll]).
This is the reason for your LIBCMTD warning. And for missing/conflicting symbols like __free or malloc or other standard looking things. And for mysterious no reason crashes when crossing dll boundaries, or even on empty place if you somehow manage to link 2 different runtimes into one binary (I've seen it!) .
Suspect preprocessor definitions like _LIB, _DLL, QT_DLL, etc.
Those are used by some libraries to decide if code supposed to be linked statically or dynamically. They usually affect headers that accompany a lib or dll. You have to know if you need them or not. RTFM or look at configs for working example projects for those.
So for your problem, first make sure you add whatever wxWidget libraries you must (and whatever dependencies they need). Search for any of the missing symbols and let google guide you. Somebody would have same problem and would have posted it somewhere before figuring it out themselves.
A good search term is
virtual bool __thiscall wxApp::Initialize
Special care is needed for runtime. When you got all libs you need, but you get libcmt* or msvc* warnings or conflicts then go through all your projects settings and check that 4 items I listed are correct and consistent. You have to know them for dependencies too, if you didn't build them yourself. Use linker verbosity flag too see exactly who brings in unwanted runtime.
Other compiler and linker settings might affect things too, so go with a fine comb through them all.
Most of those changes require clean recompile.
This is the fun of building C++ code.
Looks to me like the error you get when you link you the wrong C Runtime Library. When you build wxWidgets it uses the Multi-threaded DLL option and Multi-threaded Debug DLL options by default for Release and Debug build respectively.
To change this in you app you need to go:
Build->Properties->C/C++->Code Generation and then change the Runtime Library option and rebuild your app.
If you would prefer to statically link against the C Runtime Library so you don't need to DLL you could run a find replace again all of the vcproj files in wxWighets\build\msw and replace
RuntimeLibrary="3" with RuntimeLibrary="1"
and
RuntimeLibrary="2" with RuntimeLibrary="0"
This will change DLL builds as well however and this may not be what you want.
Related
I'm trying, without much luck, to add chm options to an existing project.
Main.cpp has this:
#include "HtmlHelp.h"
int OpenHelp(LPTSTR arg1)
{
HWND _Hhdl = HtmlHelp(GetDesktopWindow(), arg1, HH_DISPLAY_TOPIC, NULL);
return 1;
}
htmlhelp.lib is set in Linker/Input/additional Dependencies.
The error I'm getting is:
main.obj : error LNK2019: unresolved external symbol _HtmlHelpW#16 referenced in function "int __cdecl OpenHelp(wchar_t *)" (?OpenHelp##YAHPA_W#Z)
I'm new to C++ so I'm assuming my function is at fault somehow.
The idea was the function would be passed a sting in the "C:\Help.chm\::/Topic.html" format.
This question already has answers here:
What is an undefined reference/unresolved external symbol error and how do I fix it?
(39 answers)
Closed 9 years ago.
This is the error I have been getting the whole time and I've been trying to figure out how to fix it but have failed. I am asking if anyone can point me to the right direction.
WorldServer fatal error LNK1120: 2 unresolved externals
WorldServer error LNK2019: unresolved external symbol "public: class CItemElem * __thiscall CLinkedItemMgr::GetLinkedItem(unsigned long)" (?GetLinkedItem#CLinkedItemMgr##QAEPAVCItemElem##K#Z) referenced in function "private: void __thiscall CDPSrvr::OnLinkedItem(class CAr &,unsigned long,unsigned long,unsigned char *,unsigned long)" (?OnLinkedItem#CDPSrvr##AAEXAAVCAr##KKPAEK#Z)
WorldServer error LNK2019: unresolved external symbol "public: int __thiscall CLinkedItemMgr::AddLinkedItem(class CItemElem *)" (?AddLinkedItem#CLinkedItemMgr##QAEHPAVCItemElem###Z) referenced in function "private: void __thiscall CDPSrvr::OnLinkedItem(class CAr &,unsigned long,unsigned long,unsigned char *,unsigned long)" (?OnLinkedItem#CDPSrvr##AAEXAAVCAr##KKPAEK#Z)
This is the .h
#ifndef __ITEM_LINK__H
#define __ITEM_LINK__H
class CLinkedItemMgr
{
private:
CLinkedItemMgr(){ m_dwLinkedItemCount = 0;};
~CLinkedItemMgr(){};
DWORD m_dwLinkedItemCount;
public:
map<DWORD,CItemElem*> m_mapLinkedItems;
static CLinkedItemMgr *GetInstance()
{
static CLinkedItemMgr instance;
return &instance;
}
int AddLinkedItem(CItemElem *pItem);
CItemElem *GetLinkedItem(DWORD dwIndex);
};
#endif
this is the .cpp
#include "stdafx.h"
#include "ItemLink.h"
int CLinkedItemMgr::AddLinkedItem(CItemElem *pItem)
{
if(!pItem)
return 0;
m_mapLinkedItems.insert(make_pair<DWORD,CItemElem*>(++m_dwLinkedItemCount,pItem));
return m_dwLinkedItemCount;
}
CItemElem *CLinkedItemMgr::GetLinkedItem(DWORD dwIndex)
{
map<DWORD,CItemElem*>::iterator it = m_mapLinkedItems.find(dwIndex);
if(it == m_mapLinkedItems.end())
return FALSE;
return it->second;
}
Your problem is in the cpp here.
#ifdef __ITEM_LINK
#include "ItemLink.h"
#ifdef __ITEM_LINK means "only process the code below if __ITEM_LINK is defined"
And in your case, it is not defined. It only gets defined when "ItemLink.h" is included, and "ItemLink.h" only gets included if it's already defined. You've prevented either from happening first.
Remove the #ifdef line.
It looks like a linking problem.
The compiler knows your class has a function called GetLinkedItem but can't find any definition of that function anywhere. Are you linking properly when compiling your executable?
I bet stopping the compiler before linking doesn't trigger any error.
(e.g. g++ -c ItemLink.cpp).
i'm going to ask the help of someone who's accustomed to visual studio to elaborate more :D
anyway, compiling requires three major steps:
1) applying preprocessor directives, parsing the source code, looking for syntax errors and the like
2) creating an object file from source code (something half-way between source code and executable)
3) linking all the object files making up your project in one executable
your compiling chain fails at the third step.
the compiler expects a certain function to be defined in some .cpp (that has become an object file at step 2 of compiling chain) but can't find it anywhere.
and it can't find it because of that #ifdef in the .cpp file, which tells the preprocessor NOT TO INCLUDE your definitions, since __ITEM_LINK is not defined
i see you changed the .cpp in your question by the way
I'm trying to build a minimal wxWidgets application with as small a size as is easily possible. (Easily for me, that is).
It's a Hello World GUI program that doesn't do anything else. So, to my knowledge, I only need wxBase and wxCore, which I built using Visual C++ 2008 Express Edition in /MT mode.
My application looks like this:
#include "wx/app.h"
#include "wx/frame.h"
#include "wx/menu.h"
#include "wx/statusbr.h"
#include "wx/msgdlg.h"
class MyApp: public wxApp
{
virtual bool OnInit();
};
class MyFrame: public wxFrame
{
public:
MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
DECLARE_EVENT_TABLE()
};
enum
{
ID_Quit = 1,
ID_About,
};
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(ID_Quit, MyFrame::OnQuit)
EVT_MENU(ID_About, MyFrame::OnAbout)
END_EVENT_TABLE()
IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
MyFrame *frame = new MyFrame( _("Hello World"), wxPoint(50, 50),
wxSize(450,340) );
frame->Show(true);
SetTopWindow(frame);
return true;
}
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
: wxFrame( NULL, -1, title, pos, size )
{
wxMenu *menuFile = new wxMenu;
menuFile->Append( ID_About, _("&About...") );
menuFile->AppendSeparator();
menuFile->Append( ID_Quit, _("E&xit") );
wxMenuBar *menuBar = new wxMenuBar;
menuBar->Append( menuFile, _("&File") );
SetMenuBar( menuBar );
CreateStatusBar();
SetStatusText( _("Welcome to wxWidgets!") );
}
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
Close(TRUE);
}
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
wxMessageBox( _("This is a wxWidgets Hello world sample"),
_("About Hello World"),
wxOK | wxICON_INFORMATION, this);
}
Its a near exact copy of the Hello World program in the wxWidgets documentation. I just changed the include files. Replacing them with #include "wx/wx.h" doesn't solve the problem either by the way.
The build errors I get are:
test.obj : error LNK2001: unresolved external symbol "public: virtual bool __thiscall wxApp::Initialize(int &,wchar_t * *)" (?Initialize#wxApp##UAE_NAAHPAPA_W#Z)
test.obj : error LNK2001: unresolved external symbol "protected: void __thiscall wxStringBase::InitWith(wchar_t const *,unsigned int,unsigned int)" (?InitWith#wxStringBase##IAEXPB_WII#Z)
test.obj : error LNK2001: unresolved external symbol "wchar_t const * const wxEmptyString" (?wxEmptyString##3PB_WB)
test.obj : error LNK2001: unresolved external symbol "wchar_t const * const wxStatusLineNameStr" (?wxStatusLineNameStr##3QB_WB)
test.obj : error LNK2001: unresolved external symbol "wchar_t const * const wxFrameNameStr" (?wxFrameNameStr##3QB_WB)
C:\Users\microsoft\Documents\Visual Studio 2008\Projects\wxAnother\Release\wxAnother.exe : fatal error LNK1120: 5 unresolved externals
I was going to include all the changes I made to the project's properties, but I noticed that all these errors have something to do with wchar_t, which might be enough for somebody to tell me what's causing the error.
What's causing these pesky unresolved external errors and how do I solve the problem (get rid of them)?
Probably you compiled wxWidgets libs as Multi-Threaded DLL and your project is Multi-Threaded. Or (since all errors have string params in description) your wx libs are compiled with Multi-Byte character set and app with Unicode or vise versa.
You also haven't mentioned which wx libs you mentioned in LInker -> Input -> Additional Dependencies.
It sounds like you are trying to outsmart the compiler/linker.
Why?
If there is a genuine reason for you to need a small executable size then wxWidgets is not the way to go. Take a look at FLTK http://fltk.org/
I am trying to make a simple UDP socket class to do some talking between a c++ program and a java program so I'm trying to make a socket class that handles all the UDP transmission but I can't get the program to compile because I get about 8 lnk2019 errors and I have no idea what they even mean. I mainly work in Java and only use c++ when I have to lol. I have 3 files the socket header and code. Also the Udp Socket code is from rFactor-Nesim so the socket code isn't written by me.
UdpSocket.cpp
#include "UdpSocket.hpp"
#include <stdio.h>
UdpSocket::UdpSocket(const char* host, int port)
: mHost(host), mPort(port)
{
}
UdpSocket::~UdpSocket(void)
{
}
void UdpSocket::Open()
{
if(WSAStartup(MAKEWORD(2, 0), &mWinsockData) != 0)
fprintf(stderr, "WSAStartup() failed");
if ((mSocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
perror("socket() failed");
memset(&mSocketAddress, 0, sizeof(mSocketAddress));
mSocketAddress.sin_family = AF_INET;
mSocketAddress.sin_addr.s_addr = inet_addr(mHost);
mSocketAddress.sin_port = htons(mPort);
}
void UdpSocket::Close()
{
closesocket(mSocket);
WSACleanup();
}
void UdpSocket::Send(char* str, size_t length)
{
size_t result = sendto(mSocket, str, length, 0,
(struct sockaddr *) &mSocketAddress, sizeof(mSocketAddress));
if(result != length)
perror("sendto() sent incorrect number of bytes");
}
UdpSocket.hpp
#ifndef UDPSOCKET_HPP
#define UDPSOCKET_HPP
#include <WinSock.h>
class UdpSocket
{
public:
UdpSocket(const char* host, int port);
~UdpSocket(void);
void Send(char* str, size_t length);
void Open();
void Close();
private:
const char* mHost;
int mPort;
int mSocket;
struct sockaddr_in mSocketAddress;
WSADATA mWinsockData;
};
#endif // UDPSOCKET_HPP
and the main
#include "Socket/UdpSocket.hpp"
#include <iostream>
int Main(){
UdpSocket* testSocket = new UdpSocket("127.0.0.1", 27469);
testSocket->Open();
system("pause");
return 0;
}
Any help would be great. I'm not very strong with c++ but I have done a little bit
Console Ouput:
Error 1 error LNK2019: unresolved external symbol __imp__htons#4 referenced in function "public: void __thiscall UdpSocket::Open(void)" (?Open#UdpSocket##QAEXXZ) UdpSocket.obj SocketTest
Error 2 error LNK2019: unresolved external symbol __imp__inet_addr#4 referenced in function "public: void __thiscall UdpSocket::Open(void)" (?Open#UdpSocket##QAEXXZ) UdpSocket.obj SocketTest
Error 3 error LNK2019: unresolved external symbol __imp__socket#12 referenced in function "public: void __thiscall UdpSocket::Open(void)" (?Open#UdpSocket##QAEXXZ) UdpSocket.obj SocketTest
Error 4 error LNK2019: unresolved external symbol __imp__WSAStartup#8 referenced in function "public: void __thiscall UdpSocket::Open(void)" (?Open#UdpSocket##QAEXXZ) UdpSocket.obj SocketTest
Error 5 error LNK2019: unresolved external symbol __imp__WSACleanup#0 referenced in function "public: void __thiscall UdpSocket::Close(void)" (?Close#UdpSocket##QAEXXZ) UdpSocket.obj SocketTest
Error 6 error LNK2019: unresolved external symbol __imp__closesocket#4 referenced in function "public: void __thiscall UdpSocket::Close(void)" (?Close#UdpSocket##QAEXXZ) UdpSocket.obj SocketTest
Error 7 error LNK2019: unresolved external symbol __imp__sendto#24 referenced in function "public: void __thiscall UdpSocket::Send(char *,unsigned int)" (?Send#UdpSocket##QAEXPADI#Z) UdpSocket.obj SocketTest
Error 8 error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup MSVCRTD.lib SocketTest
Error 9 fatal error LNK1120: 8 unresolved externals C:\Users\Brendan\Documents\Visual Studio 2008\Projects\SocketTest\Debug\SocketTest.exe SocketTest
It sounds like you're failing to link against Winsock - Ws2_32.lib
If you're building from the command line, add Ws2_32.lib to your link command line.
If you're building from Visual Studio, look for linker flags/settings inside a project configuration dialog.
when you have code in several implementation files, you need to compile all those implementation files and pass the resulting object code files to the linker, which combines them (and other stuff) into an executable
it's not enough to include the header of a module
c++ doesn't (yet) have any technical module concept, so including headers does not magically compile implementation files or pass object code files to the linker
this is not part of the c++ standard, but it's part of everyday tool usage
the linker is telling you that you failed to provide it with object code for your class member functions the Winsock library
that object code is provided by the library file, in visual c++ typically with filename extension ".lib"
in general, when you get a mysterious error, just look up the error number in the documentation
in visual studio that's as simple as pressing the F1 key
I have Qt libraries 4.8.1 for Windows (VS 2010 ultimate) with Qt Visual Studio Add-in. This is my very simple app :
#include<qobject.h>
#include<qstring.h>
#include<memory>
class MyClass : public QObject{
Q_OBJECT
public:
MyClass( const QString &text, QObject *parent = 0 ) : m_text(text) {}
public slots:
void setText( const QString &text );
signals:
void textChanged( const QString& );
private:
QString m_text;
};
void MyClass::setText( const QString &text ){
if( m_text == text ) return;
m_text = text;
emit textChanged( m_text );
}
int main(int argc, char *argv[]){
std::shared_ptr<MyClass> a(new MyClass("foo"));
std::shared_ptr<MyClass> b(new MyClass("bar"));
QObject::connect( a.get(), SIGNAL(textChanged(const QString&)),
b.get(), SLOT(setText(const QString&)) );
a->setText("changed");
}
Errors I get related to unresolved externals : Error 6 error LNK2001:
unresolved external symbol "public: virtual int __thiscall
MyClass::qt_metacall(enum QMetaObject::Call,int,void * *)"
(?qt_metacall#MyClass##UAEHW4Call#QMetaObject##HPAPAX#Z)
Error 4 error LNK2001: unresolved external symbol "public: virtual
struct QMetaObject const * __thiscall MyClass::metaObject(void)const "
(?metaObject#MyClass##UBEPBUQMetaObject##XZ)
Error 5 error LNK2001: unresolved external symbol "public: virtual
void * __thiscall MyClass::qt_metacast(char const *)"
(?qt_metacast#MyClass##UAEPAXPBD#Z)
Error 3 error LNK2019: unresolved external symbol "protected: void
__thiscall MyClass::textChanged(class QString const &)" (?textChanged#MyClass##IAEXABVQString###Z) referenced in function
"public: void __thiscall MyClass::setText(class QString const &)"
(?setText#MyClass##QAEXABVQString###Z)
and two warnings :
Warning 1 warning MSB8017: A circular dependency has been detected
while executing custom build commands for item
"GeneratedFiles\Debug\main.moc". This may cause incremental build to
work incorrectly.
Warning 2 warning : No resources in
'C:\Users\Anonymous\documents\visual studio
2010\Projects\qtWorld\qtWorld\qtworld.qrc'.
I didn't use any qmake / nmake . They ain't required when you get latest Qt Visual Studio Add-in 1.1.11 (even Intellisense recognizes the keywords slots: signals:), right?
Now my questions :
I heard many errors are resolved by just rebuilding the whole solution , why is that ?
Please explain why I get these errors in deep and their possible solutions.
p.s please be good at explanation, don't be rep whorer
If you have QObject class defined in cpp file then you should also include moc for that file.
For example your MyClass is defined in main.cpp then you should add
#include "main.moc"
to end of your main.cpp file.
Thanks to #Tomma for providing the unexplained answer :P
Explanation why above code didn't work :
However, the moc is typically applied to header files only. Since your class definition is part of the main program file, the IDE does not recognize it.
Thanks to #koahnig for providing nice explanation
The constructor of your class is not defined, only declared. Same thing for the textChanged() method. At least that is what I see from the code that you posted. Define them and the error should go away.