Tuesday, 25 April 2017

g++ - c++ undefined reference to vtable



I'm learning C++. I'm trying to do an exercise where I define several implementations of a pure virtual class with a single function. I'm having trouble linking the class that uses these implementations.



==> BasicMath.h <==
#ifndef BASIC_MATH_H
#define BASIC_MATH_H

#include

#include

class BasicMath { };


#endif // BASIC_MATH_H

==> Operation.h <==

#ifndef OPERATION

#define OPERATION

#include
#include

class Operation {
public:
virtual void perform(std::vector vec) = 0;
};



#endif // OPERATION

==> Sum.h <==
#ifndef SUM_H
#define SUM_H

#include "Operation.h"

class Sum: public Operation {

public:
void perform(std::vector vec);
};

#endif // SUM_H

==> BasicMath.cpp <==
#ifndef BASIC_MATH_C
#define BASIC_MATH_C


#include
#include
#include
#include "BasicMath.h"
#include "Sum.h"

int main(int argc, char* argv[]) {
Sum op;
}


#endif // BASIC_MATH_C

==> Sum.cpp <==
#ifndef SUM_C
#define SUM_C

#include
#include
#include
#include "Sum.h"


void Sum::perform(std::vector vec) {
using namespace std;
int total = 0;
cout << "Total: " << total << "\n";
};

#endif // SUM_C



Compilation:



$ g++ -c Sum.cpp
$ g++ -o BasicMath BasicMath.cpp
/tmp/cc1VXjNl.o:BasicMath.cpp:(.text$_ZN3SumC1Ev[Sum::Sum()]+0x16): undefined reference to `vtable for Sum'
collect2: ld returned 1 exit status


I'm 95% sure I'm doing at least one foolish thing here - but my brain is refusing to tell me what.




I have see this question but have not managed to fix my issue.


Answer



You're not including the Sum.o object file on your compile&link line (second g++ use).


No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...