我应该#include .cpp 文件到 TestSuite 的 header 以使 cxxtest 工作吗?

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

情况如下:我有一个由两个文件组成的简单项目 - Calc.hCalc.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);
     }
}

问题

问题是,当我执行 cxxtestgen --error-printer -o runner.cpp CalcTestSuite.h && g++ -I$cxxtest -o runner.o runner.cpp && ./runner.o 时,出现错误:

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

毫无疑问,这是编译错误的原因,因为我在 Visual Studio 2019 或其他 IDE.

之外编译代码

我是如何尝试解决问题的:

我看到了几个解决方案:

1.) 保持构建命令不变,并将 #include "Calc.cpp" 添加到 TestSuite 文件,这显然有效,但不是一个好习惯。

2.) 在g++命令中添加Calc.cpp:g++ -I$cxxtest -o runner.o Calc.cpp runner.cpp && ./runner.o,但是又会导致另一个问题:

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

在这种情况下,我也尝试将 #pragma once 中的 #ifndef CALC_H... 块更改为 Calc.h,但错误仍然存​​在。

我尝试搜索 real-world cxxtest 代码示例,但没有找到我很久以前看过的网站。我很乐意收到有关处理此问题的最佳方法的任何提示。

如果您知道我可以搜索 real-life 代码片段的站点,如果您能分享它我会很高兴。

有两个问题:

您违反了一个定义规则!您不能像这样重新定义 Calc

#include "Calc.h"

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

必须是:

#include "Calc.h"

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

const int Calc::a;

现在这个问题不会浮出水面,因为你没有构建这个 cpp 而你应该。

您没有解释您是如何构建代码的。手动完成的最简单方法如下所示:

cxxtestgen --error-printer -o CalcTestSuite.cpp CalcTestSuite.h
g++ -std=c++17 -Wall -Wextra Calc.cpp CalcTestSuite.cpp -o test

Offtopic: 这个cxxtest测试框架很奇怪,有strange/complex测试构建过程。如果你学会使用更有用的东西会更好,Catch2 很棒而且易于使用(没有有趣的构建过程)并且它受到 godbolt.

的支持