Search code examples
c++visual-studio-2013lnk2019

Simple program gets LNK2019: unresolved external symbol Visual Studio 2013


I've been struggling with this error on a more complex solution for days, so I simplified a test project to see if I can't figure it out and it still gets the same error:

1>------ Build started: Project: test, Configuration: Debug Win32 ------
1>  Test.cpp
1>  MainThing.cpp
1>  main.cpp
1>  Generating Code...
1>MainThing.obj : error LNK2019: unresolved external symbol "public: static int __cdecl Test::add(int)" (?add@Test@@SAHH@Z) referenced in function "public: void __thiscall MainThing::run(void)" (?run@MainThing@@QAEXXZ)
1>P:\Leif's Documents\Visual Studio 2013\Projects\test\Debug\test.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

MainThing.h

#pragma once
class MainThing
{
public:
    MainThing();
    ~MainThing();

    void run();

private:
    int result;
};

MainThing.cpp

#include "MainThing.h"
#include "Test.h"

#include <cstdlib>

#include <iostream>

MainThing::MainThing()
{
}


MainThing::~MainThing()
{
}

void MainThing::run() {
    int result = Test::add(5);
    std::cout << result;
}

Test.h

#pragma once
class Test
{
public:
    static int add(int a);
};

Test.cpp

#include "Test.h"

int add(int a){
    int b = a;
    int c = 5;
    int d = b + c;

    return d;
}

main.cpp

#include <iostream>
#include "MainThing.h"

int main(int argc, char** argv){
    MainThing mainGame;
    mainGame.run();

    return 0;
}

This has been super frustrating and the fact that it even effects a fairly simple recreation test without any external dependencies makes it that much more so.


Solution

  • I think you just have a typo. Test.cpp should be

    #include "Test.h"
    
    int Test::add(int a){
        int b = a;
        int c = 5;
        int d = b + c;
    
        return d;
    }
    

    The way you have, you've written a free function that other things in Test.cpp could use, but no one else knows about. The compiler is looking for Test's method called add and isn't finding one.