我正在pod上开展一个项目Arduino C++
,当我决定对逻辑进行测试时遇到了一个问题。问题的本质如下:整个项目被分成带有头文件()和实现()的类。这些文件正如预期的那样位于各自的文件夹中 - 标题在,实现在,测试在。PlatformIO
VS Code
.h
.cpp
include
src
test
项目结构(这是一个用于演示问题的示例项目):
我运行测试并收到链接错误:
Linking .pio/build/native/program
/usr/bin/ld: .pio/build/native/test/mtest.o: в функции «test()»:
mtest.cpp:(.text+0x39): неопределённая ссылка на «MyClass::MyClass()»
/usr/bin/ld: mtest.cpp:(.text+0x4a): неопределённая ссылка на «MyClass::calc(int)»
/usr/bin/ld: .pio/build/native/test/mtest.o: в функции «test2()»:
mtest.cpp:(.text+0xa9): неопределённая ссылка на «MyClass::MyClass()»
/usr/bin/ld: mtest.cpp:(.text+0xe1): неопределённая ссылка на «MyClass::getString(char*)»
很明显,编译器没有从文件夹中找到文件src
。如果MyClass.cpp
将实现文件移动到文件夹test
,则所有内容都会编译并运行。但对于一个有几十个类的项目来说,采取这样的举措是不可行的。请告诉我如何修复此问题,以便文件来自src
。已编译并链接。
这是我的platformio.ini
(我已经尝试过的选项已被注释)
[env:uno]
platform = atmelavr
board = uno
framework = arduino
[env:native]
platform = native
build_src_filter =
+<src/*> # Все файлы из папки src
+<test/*> # Все файлы из папки test
; src/MyClass.cpp
; test/mtest.cpp
; src/MyClass.cpp # Путь к исходнику
; test/*.cpp # Тесты
build_flags =
-std=c++11
lib_deps =
throwtheswitch/Unity@^2.6.0
ArduinoFake
为了以防万一,以下是源代码:
MyClass.h
#ifdef TEST
#include <ArduinoFake.h>
#else
#include<Arduino.h>
#endif // TEST
class MyClass
{
private:
/* data */
public:
MyClass();
int calc(int a);
char* getString(char* src);
};
MyClass.cpp
#include "MyClass.h"
MyClass::MyClass()
{
}
int MyClass::calc(int a) {
return a * a;
}
char* MyClass::getString(char* src) {
return src + 3;
}
mtest.cpp
#define TEST
#include <unity.h>
#include "MyClass.h"
void setUp() {}
void tearDown() {}
void test() {
MyClass clazz;
TEST_ASSERT_EQUAL_INT16(clazz.calc(2), 4);
}
void test2() {
MyClass clazz;
char src[] = {"123456789"};
char expected[] = {"456789"};
char* actual = clazz.getString(src);
TEST_ASSERT_EQUAL_STRING(expected, actual);
}
int main() {
UNITY_BEGIN();
RUN_TEST(test);
RUN_TEST(test2);
return UNITY_END();
}