Библиотеки не связаны
Я создал 4 библиотеки, каждая в файлах .h и .cpp, и протестировал их по отдельности. Я сохранил гибкость проекта, определив 3 флага, которые разрешают или запрещают использование библиотек.
При интеграции их в проект я получил ошибки связывания. Во время отладки я сократил его до минимума - одного файла .ino, который содержит минимальные объявления и вызовы; но сообщения об ошибках все равно выводятся.
Я посмотрел на сокращенный код (всего 63 строки!) и не увидел никаких проблем. Я был бы признателен за любую помощь в поиске проблемы.
Код:
#define RadioIncluded
#define IrrigationStation
#define RTCincluded
/********************************************/
#ifdef RTCincluded
class rtcHighLevel
{
public:
String rtcInterpreter(String cmd);
};
rtcHighLevel rtc;
#endif
#ifdef IrrigationStation
class measureEC
{
public:
void initMeasurementStation ();
String SD12_Parser (String commandLine);
};
measureEC soilParams;
class valveControl
{
public:
void valveInit();
};
valveControl valve;
#endif
#ifdef RadioIncluded
class LoRaAddClass
{
public:
void LoRaBegin(long BAND);
};
LoRaAddClass LoRaAdd;
#endif
/*********************************************************/
void setup() {
Serial.begin(9600);
while (!Serial) {};
#ifdef RadioIncluded
LoRaAdd.LoRaBegin(915000000);
#endif
#ifdef IrrigationStation
valve.valveInit();
soilParams.initMeasurementStation();
#endif
#ifdef RTCincluded
String s = rtc.rtcInterpreter("A");
#endif
}
/*********************************************************/
void loop() {}
@user1511360, 👍1
Обсуждение1 ответ
Решено: хотя изначально я выделил подкаталог для каждого класса, никаких проблем не возникло, когда все классы были перенесены в одну папку с файлом INO, все проблемы исчезли. Это известная проблема?
https://arduino.github.io/arduino-cli/0.19/sketch-specification/, @Juraj
- Некоторые из операторов <include> не работают
- Инициализация объекта как члена класса приводит к ошибке связывания?
- Ошибки в скомпилированной программе
- Ошибка: expected unqualified-id before 'if'
- esp32, platformio A fatal error occurred: Packet content transfer stopped (received 8 bytes) *** [upload] Error 2
- Как выбрать альтернативные контакты I2C на ESP32?
- Драйверы для чипа последовательного порта CH9102X
- Ошибка компиляции кода для Arduino/Genuino Uno
Я не вижу там кода для функций, поэтому, конечно, он не будет компилироваться, и жалуюсь на отсутствие кода для этих функций., @Majenko
Если у вас возникли проблемы с условным кодом, окружающим ваши объявления и определения классов в заголовке, вы получите сообщение об ошибке от самого компилятора. То есть вы получите ошибку о чем-то необъявленном или неопределенном перед связыванием, а не о неразрешенном символе при связывании. Вам придется показать больше выходных данных сборки, в идеале не в виде изображения, а, возможно, также содержимое файла .cpp., @timemage
Я повторяю комментарий Майенко: У вас есть объявление функций-членов в объявлениях ваших классов, но вы никогда на самом деле не предоставляете реализацию этих функций. Вам нужно предоставить хотя бы пустую реализацию., @chrisl
Ссылка на библиотеку-это совсем другое дело, чем разделение вашего скетча на несколько исходных файлов. Пожалуйста, четко объясните, что вы хотите сделать, и, возможно, вы захотите прочитать соответствующие главы об этом в документации и/или на форуме Arduino. -- Обычно это признак непонимания того, как работают библиотеки, если у вас есть инструкции препроцессора, подобные этим условным обозначениям. Возможно, вам захочется узнать о реальной концепции, прежде чем вы попытаетесь продолжить. Но в качестве примитивного решения для простой ситуации это может быть нормально, однако научитесь правильному способу как можно скорее. ;-), @the busybee
Большое вам спасибо за ваши конструктивные комментарии. Хотя я создал несколько небольших скетчей Arduino, я никогда не писал такого проекта. Во - первых, правильная терминология, которую я должен был использовать, - это классы, а не библиотеки. Во - вторых, по словам Майенко и Крисла, я добавил несколько строк кодов в каждое объявление класса, и ошибки исчезли. Поэтому я приступил к добавлению классов, включив их., @user1511360
Результат оказался неутешительным - ошибки в связывании. Поэтому я сократил занятия до минимума и сосредоточился на занятиях по RTC и радио.. Я обнаружил следующее: никаких ошибок при использовании локально объявленных классов или только при использовании класса radio. Использование класса RTC отдельно или вместе с классом radio приводит к связыванию ошибок., @user1511360
#определение радиоактивности #определение RTCincluded #ifdef RTCincluded #включить "RTC3231/rtcds3231 высокого уровня.h" /*класс rtcHighLevel { общественный: Интерпретатор строки rtcInterpreter(строка cmd) {возвращает cmd;}; };*/ RTC высокого уровня; #эндиф /***************************************/ #если радиоактивно включено #определите уровень 5 LoPowerLevel #определите уровень HiPowerLevel 20 #включить "связь/LoRaAdd.h" /*класс LoRaAddClass { общественный: void LoRaBegin(длинная ПОЛОСА) {длинная ПОЛОСА x =;}; };*/ //ЛоРаАддКласс ЛоРаАдд; #эндиф, @user1511360