情况如下:我有一个由两个文件组成的简单项目 -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;
};
}
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.) 将 Calc.cpp 添加到 g++ command: 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 代码示例,但没有找到我很久以前看到的站点。我很高兴收到有关处理此问题的最佳方法的任何提示。
如果你知道我可以搜索真实代码片段的网站,如果你分享它,我会很高兴。