При компиляции юнит-тестов в 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 шт):
build_src_filter вообще не нужен. Предполагается, что в папке src хранится исходный код финального продукта. Этот код не подпадает под юнит тесты. Они предназначены для библиотек, которые располагаются в папке lib. Соответственно файлы необходимо будет перенести примерно так:
project_dir
├── lib
│ ├── MyClass
│ │ ├── include
│ │ │ └── MyClass.h
│ │ └── src
│ │ └── MyClass.cpp
Заголовок, находящийся в папке с заголовочными файлами, следует включать с использованием синтаксиса <>:
#include <MyClass.h>
