18

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?

0

5 Answers 5

18

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.

Sign up to request clarification or add additional context in comments.

Comments

13

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

2 Comments

This can't be an actual solution... This requires including a lot of cpp files
This doesn't explain why this only happens with x64 configuration.
4

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

Comments

1

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.

1 Comment

Everything runs with 64 bit so that shouldn't be it. As I stated, I am sure that I put in the correct include paths etc.
1

The issue is name mangling because you are calling from c++ to c. Solution is wrap call to c code header with Extern C

extern "C" { #include "../LifeLib/StornoTafel.h" #include "../LifeLib/testVariables.h" } 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.