繁体   English   中英

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

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

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

计算测试套件.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++ 命令: 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 代码示例,但没有找到我很久以前看过的网站。 我很乐意收到有关处理此问题的最佳方法的任何提示。

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

有两个问题:

您违反了一个定义规则! 您不能像这样重新定义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测试框架很奇怪并且有奇怪/复杂的测试构建过程。 如果您学会使用更有用的东西会更好, Catch2很棒且易于使用(没有有趣的构建过程)并且它受godbolt支持。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM