首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我是否应该将.cpp文件包含到TestSuite的头部以使cxxtest正常工作?

我是否应该将.cpp文件包含到TestSuite的头部以使cxxtest正常工作?
EN

Stack Overflow用户
提问于 2022-02-10 13:19:16
回答 1查看 104关注 0票数 0

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

加州h:

代码语言:javascript
复制
#pragma once

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

Calc.cpp:

代码语言:javascript
复制
#include "Calc.h"

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

CalcTestSuite.h:

代码语言:javascript
复制
#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时,会发生一个错误:

代码语言:javascript
复制
runner.cpp: (.text._ZN13...(many letters)): undefined reference to `Calc::add(int,int)`

毫无疑问,当我在Visual 2019或其他IDE之外编译代码时,编译是错误的。

我是如何解决这个问题的:

我看到了几种解决方案:

1.)让build命令保持原样,并将#include "Calc.cpp"添加到TestSuite文件中,这显然会起作用,但这是一种糟糕的做法。

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

代码语言:javascript
复制
Calc.cpp:3:7: error: redefinition of 'class Calc'

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

我试着搜索真实的cxxtest代码示例,但没有找到我很久以前见过的站点。我很高兴收到任何关于处理这个问题的最佳方法的建议。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-10 13:33:24

有两个问题:

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

代码语言:javascript
复制
#include "Calc.h"

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

它必须是:

代码语言:javascript
复制
#include "Calc.h"

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

const int Calc::a;

现在,这个问题不会出现,因为您没有构建这个cpp,您应该这样做。

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

代码语言:javascript
复制
cxxtestgen --error-printer -o CalcTestSuite.cpp CalcTestSuite.h
g++ -std=c++17 -Wall -Wextra Calc.cpp CalcTestSuite.cpp -o test

离题:这个cxxtest测试框架很奇怪,有着奇怪/复杂的测试构建过程。如果您学习使用更有用的东西,Catch2很棒而且易于使用(没有有趣的构建过程),并且得到哥德波特的支持,会更好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71065852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档