'Should I #include .cpp files to header of TestSuite to make cxxtest work?

Situation is as follows: I've got a simple project consisting of two files - Calc.h and Calc.cpp.

Calc.h:

#pragma once

class Calc {
public:
    int add(int,int);
    static const int a = 42;
}

Calc.cpp:

#include "Calc.h"

class Calc {
public:
    int add(int a,int b){
        return a + b;
    };
}

CalcTestSuite.h:

#pragma once
#include "Calc.h"
#include <cxxtest/TestSuite.h>

class CalcTestSuite : public CxxTest::TestSuite {
public:
     void testAddition(void)
     {
           Calc calculator;
           TS_ASSERT_EQUALS(calculator.a, 42);
           TS_ASSERT_EQUALS(calculator.add(1,2), 3);
     }
}

The problem

The problem being is, when I do cxxtestgen --error-printer -o runner.cpp CalcTestSuite.h && g++ -I$cxxtest -o runner.o runner.cpp && ./runner.o, an error occurs:

runner.cpp: (.text._ZN13...(many letters)): undefined reference to `Calc::add(int,int)`

Undoubtedly, the reason of that is wrong compiling as I compile code outside of Visual Studio 2019 or other IDE.

How I tried to solve the problem:

I see a couple of solutions:

1.) Leave build command as is and add #include "Calc.cpp" to TestSuite file, which will obviously work but would be a bad practice.

2.) Add Calc.cpp to g++ command: g++ -I$cxxtest -o runner.o Calc.cpp runner.cpp && ./runner.o, however, it leads to another problem:

Calc.cpp:3:7: error: redefinition of 'class Calc'

In that case I also tried changing #pragma once to #ifndef CALC_H... block in Calc.h, but the error remained.

I tried searching for real-world cxxtest code examples, but didn't find the site I've seen long ago. I would be glad to recieve any tips on what's the best way to deal with this issue.

And if you know the site where I can search for real-life code snippets I would be glad if you shared it.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source