我一直在玩我购买的一个小型Arduino机器人,发现代码中有几个错误在运行(我可能已经把它们放在哈哈了),并想将gtest应用于代码中以查找错误)。问题是#include“ Arduino.h”不是我可以在PC上运行的东西。这是我很难将代码与代码分离的原因。
我想在我的测试文件夹中构建一个测试可执行文件,该可执行文件可以在PC上运行,但仍将大多数功能代码保留在上面的目录中,以便Arduino IDE也可以构建。任何帮助将不胜感激。
结构:
<Folder>
-ArduinoBuild.ino
-Class.h
-Class.cpp
-<test folder>
--test.cpp
--CMakeList.txt
这是问题开始的地方,将Arduino.h引入了构建版本
Class.h
#ifndef CLASS_H_
#define CLASS_H_
#include "Arduino.h"
class Class{
public:
int Some_Attribute = 0;
void member_function();
};
#endif
Class.cpp
#include "Class.h"
void Class::member_function(){
Some_Attribute = Some_ArduinoFunc(this->Some_Attribute);
}
现在,如果我可以从构建中删除Arduino.h,则可以在测试脚本中放置虚拟函数来弥补这一空白,但是我想在构建过程中将Arduino.h保留在某个位置,这样我就可以了。每次我要为Arduino构建时都不必添加它。我尝试了几种方法,其中之一是将#include“ Arduino.h”移至.ino文件,以期在为Arduino构建时将其向下传递至Class.h / cpp文件。
test.cpp
// Class_test.cpp
#include <gtest/gtest.h>
#include "../Class.cpp"
TEST(buildbin, member_function) {
Class car;
car.member_function(1);
ASSERT_EQ(1, car.Some_Attribute);
}
再次感谢您的帮助。
POST SOLUTION更新: 这是我必须在父文件夹中的脚本中输入的内容的示例标头:
#ifndef ARDUINO
#include<cmath>
#define floor std::round
void delay(int i){}
#endif
要访问文件以模仿库文件,您需要做的是:
#include "test/FakeLib.XX"
答案 0 :(得分:0)
使用宏。
您可以使用#ifdef
... #endif
选择性地包含代码。示例:
#ifdef ARDUINO_VERSION
#include "Arduino.h"
#endif
void setup() {
// no setup
}
void loop() {
#ifdef ARDUINO_VERSION
digitalWrite(1, HIGH);
#else
printf("Setting pin 1 high\n");
#endif
}
还有#ifndef
与此相反,如果未定义ARDUINO_VERSION ,则仅包含代码。
现在您可能要问,编译器如何知道它是否为ARDUINO_VERSION?好问题。基于this线程,Arduino似乎将为您定义ARDUINO
,因此您可以使用#ifdef ARDUINO
。另外,由于应该对测试的编译方式有更多的控制,因此可以使用#ifdef TEST_VERSION
,然后使用-DTEST_VERSION
选项来编译测试。