При компиляции юнит-тестов в PlatformIO VS Code компилятор не видит файлы реализации .cpp

Работаю над проектом на 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();
}

Ответы (1 шт):

Автор решения: user7860670

build_src_filter вообще не нужен. Предполагается, что в папке src хранится исходный код финального продукта. Этот код не подпадает под юнит тесты. Они предназначены для библиотек, которые располагаются в папке lib. Соответственно файлы необходимо будет перенести примерно так:

project_dir
├── lib
│   ├── MyClass
│   │   ├── include
│   │   │   └── MyClass.h
│   │   └── src
│   │       └── MyClass.cpp

Заголовок, находящийся в папке с заголовочными файлами, следует включать с использованием синтаксиса <>:

#include <MyClass.h>
→ Ссылка