Europa
Europa

Reputation: 1284

wxwidgets app in Visual Studio gives error "LNK2019 unresolved external symbol"

Im creating my first program with C++ and wxwidgets. When I try to compile the project I get errors.

LNK2019 unresolved external symbol _main referenced in function "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)

LNK1120 1 unresolved externals

I have compiled the wxwidgets my self in Visual Studio.

After compiling I created a new C++ empty project in Visual Studio.

I went to configuration and added includes directories:

Configuration properties -> C/C++ -> General -> Additional include directories:

C:\Users\user\source\repos\wxWidgets\include; C:\Users\user\source\repos\wxWidgets\include\msvc

Configuration properties -> Linker -> Additional Library Directories:

C:\Users\user\source\repos\wxWidgets\lib\vc_lib

Then I added 2 classes, cApp and cMain.

cApp.h

#pragma once

#include "wx/wx.h"
#include "cMain.h"

class cApp : public wxApp
{
public:
    cApp();
    ~cApp();

private: 
    cMain* m_frame1 = nullptr;

public: 
    virtual bool OnInit();
};

cApp.cpp

#include "cApp.h"

wxIMPLEMENT_APP(cApp);

cApp::cApp() {

}

cApp::~cApp() {

}

bool cApp::OnInit() {
    m_frame1 = new cMain();
    m_frame1->Show();

    return true;
}

cMain.h

#pragma once

#include "wx/wx.h"

class cMain : public wxFrame
{
public:
    cMain();
    ~cMain();
};

cMain.cpp

#include "cMain.h"

cMain::cMain() : wxFrame(nullptr, wxID_ANY, "MyProgram") {

}

cMain::~cMain() {

}

Upvotes: 6

Views: 3917

Answers (2)

Console_Worm
Console_Worm

Reputation: 26

Your linker wants to find the main entry point (main is the default entry point). The wxIMPLEMENT_APP(cApp) macro on the Windows architecture has the WinMain entry point.

I have three quick solutions.

  1. You can write a macro #define WinMain main before macro wxIMPLEMENT_APP(cApp)

  2. You can tell the linker the name of the entry point( In your case, the name of the entry point is WinMain).

project properties -> Configuration Properties -> Linker -> Advanced and on the right pane of the dialog is a place for the name of the entry point function.

  1. Your Visual Studio project has a Console SubSystem installed (this SubSystem looks for the default main entry point). You must change the SubSystem value to WINDOWS (this SubSystem looks for the WinMain entry point).

Project properties -> Configuration Properties -> Linker -> System and then set the SubSystem property to Windows (/SUBSYSTEM:WINDOWS)

Upvotes: 1

VZ.
VZ.

Reputation: 22688

You have 2 problems (after the edit due to the comment below) the following problem:

  1. You're building your application as a console mode application and not a GUI one. While it is possible to use wxWidgets from console applications too, this is probably not what you're trying to do, so ensure that the "Linker|System|SubSystem" option in the properties dialog of your project is set to "Windows".
  2. You don't have wxIMPLEMENT_APP(cApp); macro in your code. Again, it is perfectly possible to avoid it, but this is probably not your goal here, so just add this line. This macro is what defines main or WinMain for your application, depending on the platform.

Upvotes: 5

Related Questions