[英]Should I #include .cpp files to header of TestSuite to make cxxtest work?
Calc.h
和Calc.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.