0

情况如下:我有一个由两个文件组成的简单项目 -Calc.hCalc.cpp.

计算.h:

#pragma once

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

计算.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.) 将 Calc.cpp 添加到 g++ command: 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,但错误仍然存​​在。

我尝试搜索真实世界的 cxxtest 代码示例,但没有找到我很久以前看到的站点。我很高兴收到有关处理此问题的最佳方法的任何提示。

如果你知道我可以搜索真实代码片段的网站,如果你分享它,我会很高兴。

4

1 回答 1

2

有两个问题:

你违反了一个定义规则!你不能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

题外话:这个cxxtest测试框架很奇怪,并且有奇怪/复杂的测试构建过程。如果您学会使用更有用的东西会更好,Catch2它很棒且易于使用(没有有趣的构建过程)并且它由godbolt支持。

于 2022-02-10T13:33:24.373 回答