我应该#include .cpp 文件到 TestSuite 的 header 以使 cxxtest 工作吗?
Should I #include .cpp files to header of TestSuite to make cxxtest work?
情况如下:我有一个由两个文件组成的简单项目 - Calc.h
和 Calc.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.
的支持
情况如下:我有一个由两个文件组成的简单项目 - Calc.h
和 Calc.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.