2

I've been getting these two errors and I cant seem to find a solution that works.

LNK1120: 1 unresolved externals

Error 1 error LNK2019: unresolved external symbol "public: __thiscall Vector3D::Vector3D(class Vector3D const &)" (??0Vector3D@@QAE@ABV0@@Z) referenced in function "public: class Vector3D __thiscall Vertex::GetPosition(void)" (?GetPosition@Vertex@@QAE?AVVector3D@@XZ)

I think its to do with my Matrix operator and the constructor in my Vector 3d class Any help will be much appreciated as I am quite new to C++

#ifndef MATRIX4_H
#define MATRIX4_H

#include "Vector3D.h"

class Matrix4
{
    public:
    Matrix4();
    Matrix4(const Matrix4& rhs);
    ~Matrix4();

    Vector3D Matrix4::operator *(Vector3D vector)
    {
        Vector3D newVector;

        newVector.SetVector_X((m[0][0] * vector.GetVector_X()) + (m[0][1] * vector.GetVector_Y()) + (m[0][2] * vector.GetVector_Z()) + m[0][3]);
        newVector.SetVector_Y((m[0][0] * vector.GetVector_X()) + (m[1][1] * vector.GetVector_Y()) + (m[1][2] * vector.GetVector_Z()) + m[1][3]);
        newVector.SetVector_Z((m[0][0] * vector.GetVector_X()) + (m[2][1] * vector.GetVector_Y()) + (m[2][2] * vector.GetVector_Z()) + m[2][3]);
        return Vector3D(newVector.GetVector_X(),newVector.GetVector_Y(),newVector.GetVector_Z());
        
    }
    
    void SetMatrix(float matrix[4][4])
    {
        memcpy(m,matrix,sizeof(matrix));
    }
    
    private:
      float m[4][4];
   }; 
   #endif

Vector3D.h file

#ifndef VECTOR3D_H
#define VECTOR3D_H

class Vector3D
{
  public:
    Vector3D();
    Vector3D(const Vector3D& rhs);
    ~Vector3D();
    
    Vector3D(float VectorX, float VectorY, float VectorZ)
    {
        x=VectorX;
        y=VectorY;
        z=VectorZ;
    }

    void SetVector3D(float vector_X, float vector_Y, float vector_Z)
    {
        x = vector_X;
        y = vector_Y;
        z = vector_Z;
    }

    void SetVector_X(float vector_X)
    {
        x=vector_X;
    }

    void SetVector_Y(float vector_Y)
    {
        y=vector_Y;
    }
    
    void SetVector_Z(float vector_Z)
    {
        z=vector_Z;
    }

    float GetVector_X()
    {
        return x;
    }

    float GetVector_Y()
    {
        return y;
    }

    float GetVector_Z()
    {
        return z;
    }

    Vector3D GetVector()
    {
        return Vector3D(x,y,z);
    }

private:
    float x;
    float y;
    float z;

   };
  #endif
Community
  • 1
  • 1
Daniel Mayles
  • 25
  • 1
  • 1
  • 3

3 Answers3

6

It says that the linker cannot find an implementation of Vector3D(const Vector3D& rhs);. This constructor is declared in your vector class, but not defined.

Do you have an implementation of the constructor somewhere in a .cpp file, and is this file known to your compiler?

C/C++ compilation works like that: At first, you have a number of so called "compilation units" - normally, every .cpp-file is one such compilation unit. Your program consists of all these separate units linked together (the "linking" process, happens after compilation). Every function that is called somewhere has to be defined exactly once in some compilation unit, unless it is defined inline (like the other methods of your class). If a method is declared, but not defined, the compiler will not complain - only the linker will. Imagine the compilation units having "sockets" and "connectors" which fit to the corresponding "sockets" of other units. The compilation process just creates these units assuming a particular "socket" shape (as given by declarations), whereas the linker actually tries to connect each "socket" with it's "connector". So you see how the compilation process may suceed, but the linking not.

Linker errors can be tricky to solve, especially if you're not that experienced yet. There can be many causes for them:

  • Missing implementation/definition
  • Definition exists, but somehow is not compiled (because the file is not passed to the compiler etc.)
  • Different versions of libraries etc.

And many more..

Edit: Apart from that, you should pass the vector by const reference, and create newVector by invoking it's constructor, instead of creating a default constructed object and then assigning. And the final construction in the return statement is not needed as well. Improved code:

Vector3D Matrix4::operator *(const Vector3D& vector)
{
    return Vector3D(
        (m[0][0] * vector.GetVector_X()) + (m[0][1] * vector.GetVector_Y()) + (m[0][2] * vector.GetVector_Z()) + m[0][3],
        (m[0][0] * vector.GetVector_X()) + (m[1][1] * vector.GetVector_Y()) + (m[1][2] * vector.GetVector_Z()) + m[1][3],
        (m[0][0] * vector.GetVector_X()) + (m[2][1] * vector.GetVector_Y()) + (m[2][2] * vector.GetVector_Z()) + m[2][3]
    );
}
lethal-guitar
  • 4,438
  • 1
  • 20
  • 40
  • Funnily enough, I had this problem when VS put my .cpp file in the wrong folder. My compiler just didn't find it. Great answer, and thank you. – Mizmor Jun 16 '14 at 21:58
2

Your implementation of Vector3D appears to be missing an actual implementation for the copy constructor, hence the unresolved external error. If you don't intend the Vector3D object to be copied, you can't pass it into Matrix::operator* by value as that would trigger a copy.

That said, I don't think there is any reason to declare and implement the copy constructor for Vector3D anyway as it only contains POD types and the compiler generated copy constructor will work fine. The same goes for the destructor, there are no resources to manage so let the compiler do its job.

Timo Geusch
  • 24,095
  • 5
  • 52
  • 70
1

Did you implement the Vector3D default constructor, copy constructor, and destructor? You showed your headers but not the implementation files. The linker complains about a missing defintion of Vector3D::Vector3D(Vector3D const&).

Dietmar Kühl
  • 150,225
  • 13
  • 225
  • 380