情况如下:我有一个由两个文件- Calc.h和Calc.cpp组成的简单项目。
加州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 2019或其他IDE之外编译代码时,编译是错误的。
我是如何解决这个问题的:
我看到了几种解决方案:
1.)让build命令保持原样,并将#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更改为Calc.h中的#ifndef CALC_H...块,但错误仍然存在。
我试着搜索真实的cxxtest代码示例,但没有找到我很久以前见过的站点。我很高兴收到任何关于处理这个问题的最佳方法的建议。
如果你知道我可以搜索真实代码片段的网站,我会很高兴你能分享它。
发布于 2022-02-10 13:33:24
有两个问题:
你违反了一个定义规则!您不能这样重新定义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很棒而且易于使用(没有有趣的构建过程),并且得到哥德波特的支持,会更好。
https://stackoverflow.com/questions/71065852
复制相似问题