LNK2019: unresolved external symbol in VS unit-tes

2020-08-18 05:42发布

I get the error as stated in the title. I ensured the following:
- The Include directory, include library and additional include directory are set correctly
- In the properties, Subsystem is set to CONSOLE

Comments to my code: LifeLib is a project that contains classes of that I want to test some methods. The classes are defined in namespace LifeLib. One of them is StornoTafel. testVariables is NOT defined in any namespace.
I get the linking error 3 times, for 2 constructors and 1 method in StornoTafel (noted in the code).

//project Tester
#include "stdafx.h"
#include "CppUnitTest.h"

#include "../LifeLib/StornoTafel.h"
#include "../LifeLib/testVariables.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace Tester
{       
    TEST_CLASS(AggSelTest)
    {
    public:
        LifeLib::StornoTafel stornoTafel_; // LNK2019
        LifeLib::StornoTafel *stornoTafel_; // no error, but I need an instance and not a reference to proceed -> see init method
        LifeLib::testVariables test_vars_; // everything is fine

        TEST_METHOD_INITIALIZE(init) {
            stornoTafel_ = StornoTafel(test_vars_.lapseProb); // when this line is commented out I only get the first error (see below)
        }
    }
}

// testVariables.h
#pragma once
#include <iostream>
#include <vector>

class testVariables {
public:
    testVariables() {};
// here are a lot of vectors with values for testing purposes
std::vector<double> _lapseProb= {0,1,2}; // [...]
};

// StornoTafel.h
#pragma once
#include "masterheader.h"

namespace LifeLib {
    class StornoTafel {
    public:

        StornoTafel(); //LNK2019
        StornoTafel(std::vector<double> ProbabilityOfLapseInYearT); //LNK2019

        StornoTafel(const StornoTafel &obj); //no error

        StornoTafel operator=(StornoTafel const& rhs); //LNK2019

        //! \name Getter
        //@{ 
        const std::vector<double>& Stornowahrscheinlichkeit() const;
        //@}
    protected:
        std::vector<double> Stornowahrscheinlichkeit_;
    };
    inline const std::vector<double>& StornoTafel::Stornowahrscheinlichkeit() const {
        return Stornowahrscheinlichkeit_;
    }
}

//StornoTafel.cpp
#include "StornoTafel.h"

LifeLib::StornoTafel::StornoTafel() {
}

LifeLib::StornoTafel::StornoTafel(std::vector<double> ProbabilityOfLapseInYearT) {
    Stornowahrscheinlichkeit_ = ProbabilityOfLapseInYearT;
}

LifeLib::StornoTafel::StornoTafel(const StornoTafel &obj) {
    Stornowahrscheinlichkeit_ = obj.Stornowahrscheinlichkeit_;
}

LifeLib::StornoTafel LifeLib::StornoTafel::operator=(StornoTafel const& rhs) {
    Stornowahrscheinlichkeit_ = rhs.Stornowahrscheinlichkeit_;
    return *this;
}

//masterheader.h
#pragma once
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>

#include <algorithm>
#include <ctime>

errors in detail:

  1. LNK2019 unresolved external symbol "public: __cdecl LifeLib::StornoTafel::StornoTafel(void)" (??0StornoTafel@LifeLib@@QEAA@XZ) referenced in function "public: __cdecl AggSelTester::AggSelTest::AggSelTest(void)" (??0AggSelTest@AggSelTester@@QEAA@XZ)
  2. LNK2019 unresolved external symbol "public: __cdecl LifeLib::StornoTafel::StornoTafel(class std::vector >)" (??0StornoTafel@LifeLib@@QEAA@V?$vector@NV?$allocator@N@std@@@std@@@Z) referenced in function "public: void __cdecl AggSelTester::AggSelTest::init(void)" (?init@AggSelTest@AggSelTester@@QEAAXXZ)
  3. LNK2019 unresolved external symbol "public: class LifeLib::StornoTafel __cdecl LifeLib::StornoTafel::operator=(class LifeLib::StornoTafel const &)" (??4StornoTafel@LifeLib@@QEAA?AV01@AEBV01@@Z) referenced in function "public: void __cdecl AggSelTester::AggSelTest::init(void)" (?init@AggSelTest@AggSelTester@@QEAAXXZ)

Why do they arise?

4条回答
戒情不戒烟
2楼-- · 2020-08-18 05:50

I found the answer by myself: I have to include the .cpp file.
So #include "../LifeLib/StornoTafel.cpp" fixes the error. However, I have no idea why.

查看更多
相关推荐>>
3楼-- · 2020-08-18 05:51

I had similar problem and fixed it by adding the output .obj files to the dependencies of the test project.

refer to MSDN document - https://msdn.microsoft.com/en-us/library/hh419385.aspx#objectRef

查看更多
我想做一个坏孩纸
4楼-- · 2020-08-18 05:55

I know this is very late but let me explain why including the .cpp file fixes the issue.

#include "../LifeLib/StornoTafel.h"

...

LifeLib::StornoTafel stornoTafel_; // Throws unresolved external symbol

Your unit test project exists outside of your application, you have provided references to the header files which provide the declarations of your types and methods but not their definitions.

By placing references to the .cpp files the compiler can actually get the declarations of these signatures:

#include "../LifeLib/StornoTafel.h"
#include "../LifeLib/StornoTafel.cpp"

...

LifeLib::StornoTafel stornoTafel_; // Works perfectly

The simplest solution is to simply duplicate your header file reference and change .h to .cpp

查看更多
forever°为你锁心
5楼-- · 2020-08-18 06:07

In my experience two things make this error show up, either in the software you are using you didn't properly include it in your project, therefor the link error shows up, or maybe there is a mix between the versions of both your project and the one you try to include. By this i mean, check if they are both 64 or 32. if they are not the same this error will show up. These are the things i know can cause this, it can be something else.

查看更多
登录 后发表回答