Библиотеки не связаны

Я создал 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() {}

, 👍1

Обсуждение

Я не вижу там кода для функций, поэтому, конечно, он не будет компилироваться, и жалуюсь на отсутствие кода для этих функций., @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


1 ответ


1

Решено: хотя изначально я выделил подкаталог для каждого класса, никаких проблем не возникло, когда все классы были перенесены в одну папку с файлом INO, все проблемы исчезли. Это известная проблема?

,

https://arduino.github.io/arduino-cli/0.19/sketch-specification/, @Juraj